PetaPoco支持Dynamic(ExpandoObject)类型参数

简介:

修改ParametersHelper类,添加ExpandoObject的类型判断吧,修改后的代码如下:

复制代码
// PetaPoco - A Tiny ORMish thing for your POCO's.
// Copyright © 2011-2012 Topten Software.  All Rights Reserved.
 
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Text;

namespace PetaPoco.Internal
{
    internal static class ParametersHelper
    {
        // Helper to handle named parameters from object properties
        public static string ProcessParams(string sql, object[] args_src, List<object> args_dest)
        {
            return rxParams.Replace(sql, m =>
            {
                string param = m.Value.Substring(1);

                object arg_val;

                int paramIndex;
                if (int.TryParse(param, out paramIndex))
                {
                    // Numbered parameter
                    if (paramIndex < 0 || paramIndex >= args_src.Length)
                        throw new ArgumentOutOfRangeException(string.Format("Parameter '@{0}' specified but only {1} parameters supplied (in `{2}`)", paramIndex, args_src.Length, sql));
                    arg_val = args_src[paramIndex];
                }
                else
                {
                    // Look for a property on one of the arguments with this name
                    bool found = false;
                    arg_val = null;
            
                    foreach (var o in args_src)
                    {
                        //使其支持ExpandoObject
                        if (o.GetType() == typeof(System.Dynamic.ExpandoObject))
                        {
                            var dic = o as IDictionary<string, object>;
                            if (dic.ContainsKey(param))
                            {
                                arg_val = dic[param];
                                found = true;
                                break;
                            }
                        }
                        else
                        {
                            var pi = o.GetType().GetProperty(param);
                            if (pi != null)
                            {
                                arg_val = pi.GetValue(o, null);
                                found = true;
                                break;
                            }
                        }
                    }

                    if (!found)
                        throw new ArgumentException(string.Format("Parameter '@{0}' specified but none of the passed arguments have a property with this name (in '{1}')", param, sql));
                }

                // Expand collections to parameter lists
                if ((arg_val as System.Collections.IEnumerable) != null &&
                    (arg_val as string) == null &&
                    (arg_val as byte[]) == null)
                {
                    var sb = new StringBuilder();
                    foreach (var i in arg_val as System.Collections.IEnumerable)
                    {
                        sb.Append((sb.Length == 0 ? "@" : ",@") + args_dest.Count.ToString());
                        args_dest.Add(i);
                    }
                    return sb.ToString();
                }
                else
                {
                    args_dest.Add(arg_val);
                    return "@" + (args_dest.Count - 1).ToString();
                }
            }
            );
        }

        static Regex rxParams = new Regex(@"(?<!@)@\w+", RegexOptions.Compiled);
    }
}


本文转自齐师傅博客园博客,原文链接:http://www.cnblogs.com/youring2/archive/2013/05/08/3066360.html,如需转载请自行联系原作者
相关文章
|
6月前
|
存储 JavaScript 安全
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
TypeScript 中的 Number 类型,Number 类型的特性、常见操作和注意事项
474 1
|
3月前
|
传感器 开发框架 JSON
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
聊聊 C# dynamic 类型,并分享一个将 dynamic 类型变量转为其它类型的技巧和实例
164 0
|
6月前
|
人工智能 安全 机器人
【C++】dynamic_cast基本用法(详细讲解)
【C++】dynamic_cast基本用法(详细讲解)
C#-数据类型(dynamic)
C#-数据类型(dynamic)
80 0
|
编译器 C++ 开发者
c++新特性:类型别名(Type Alias)
c++新特性:类型别名(Type Alias)
120 0
|
JSON 安全 Go
GoFrame 通用类型变量gvar | 对比 interface{}
这篇文章将介绍 GoFrame 通用类型变量gvar的概念,对比 interface{}的特点;以及如何设置gvar的并发安全开关等基础使用;介绍序列化示例代码。
205 0
GoFrame 通用类型变量gvar | 对比 interface{}
|
Dart
Dart之dynamic(任意类型)
Dart之dynamic(任意类型)
90 0
Dart之dynamic(任意类型)
|
JSON C# 数据格式
C# 使用dynamic类型来访问JObject对象
原文:C# 使用dynamic类型来访问JObject对象 dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。
1365 0
|
C++
C++标准转换运算符dynamic_cast
dynamic_cast (expression) dynamic_cast运算符,应该算是四个里面最特殊的一个,因为它涉及到编译器的属性设置,而且牵扯到的面向对象的多态性跟程序运行时的状态也有关系,所以不能完全的使用传统的转换方式来替代。
908 0