我想通过反射选择正确的通用方法,然后调用它.
通常这很容易.例如
var method = typeof(MyType).GetMethod("TheMethod");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Run Code Online (Sandbox Code Playgroud)
但是,当方法存在不同的泛型重载时,问题就开始了.例如,System.Linq.Queryable类中的静态方法.'Where'方法有两种定义
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,bool>> predicate)
static IQueryable<T> Where(this IQueryable<T> source, Expression<Func<T,int,bool>> predicate)
Run Code Online (Sandbox Code Playgroud)
这说明GetMethod无法正常工作,因为它无法让两者黯然失色.因此,我想选择正确的.
到目前为止,我经常只采取第一种或第二种方法,这取决于我的需要.像这样:
var method = typeof (Queryable).GetMethods().First(m => m.Name == "Where");
var typedMethod = method.MakeGenericMethod(theTypeToInstantiate);
Run Code Online (Sandbox Code Playgroud)
但是我对此并不满意,因为我做了一个很大的假设,即第一种方法是正确的.我宁愿通过参数类型找到正确的方法.但我无法弄清楚如何.
我尝试传递'类型',但它没有用.
var method = typeof (Queryable).GetMethod(
"Where", BindingFlags.Static,
null,
new Type[] {typeof (IQueryable<T>), typeof (Expression<Func<T, bool>>)},
null);
Run Code Online (Sandbox Code Playgroud)
所以有人知道如何通过反射找到'正确'的通用方法.例如,Queryable类的'Where'方法的正确版本?
我正在尝试将 a ListofSystem.Object对象转换为 a Listof 强类型对象。
这是我得到的错误:
“System.Collections.Generic.List`1[System.Object]”类型的对象无法转换为“System.Collections.Generic.List`1[TestApp.Tsc_Mrc_Step]”类型。
目的是因为我正在为我的项目编写一个业务数据层,您所要做的就是将您的类和属性命名为与数据库中的实体相同的名称,并且数据层将自动填充引用的表作为在班级。
业务数据层使用反射、泛型和对象来处理所有这些。
下面是我尝试将对象列表放入已知类型列表的代码。问题是,对象是已知类型,但我将其作为对象传递....如何在不知道它是什么的情况下将其转换为已知类型?
bool isCoollection = false;
Type t = GetTypeInsideOfObjectByTypeName(o, tableName, out isCoollection);
List<object> objectColl = new List<object>();
object obj = Activator.CreateInstance(t);
if (obj != null)
{
PropertyInfo[] objectProps = obj.GetType().GetProperties();
foreach (PropertyInfo op in objectProps)
{
if (HasColumn(reader, op.Name))
{
op.SetValue(obj, reader[op.Name]);
}
}
if (isCoollection)
{
objectColl.Add(obj);
}
}
if (isCoollection)
{
IEnumerable<object> objs = objectColl.AsEnumerable();
SetObject(o, objs);
}
else
{
SetObject(o, obj);
}
Run Code Online (Sandbox Code Playgroud)
这是 …