编辑:我正在尝试运行此类的类/方法是静态的,因此我无法将其传递给generic.Invoke
我有一个静态数据访问类,用于自动解析来自各种来源的数据。 当我遇到问题时,我开始重新考虑它。 我想通过反射将Type传递给Generic方法, (该方法然后解析类型并返回带有值的Type) 我的代码目前看起来像
Type type1 = typeof( T );
var item = (T)Activator.CreateInstance( typeof( T ), new object[] { } );
foreach (PropertyInfo info in type1.GetProperties())
{
Type dataType = info.PropertyType;
Type dataType = info.PropertyType;
MethodInfo method = typeof( DataReader ).GetMethod( "Read" );
MethodInfo generic = method.MakeGenericMethod( dataType );
//The next line is causing and error as it expects a 'this' to be passed to it
//but i cannot as i'm inside a static class
generic.Invoke( this, info.Name, reader );
info.SetValue(item,DataReader.Read<dataType>(info.Name, reader ) , null);
}
答案 0 :(得分:2)
我猜DataReader.Read
是静态方法,对吧?
因此,更改错误行,如下所示,因为您正在调用静态方法。没有对象,因此您只需将null
传递给Invoke
方法:
var value = generic.Invoke( null, new object[] {info.Name, reader} );
答案 1 :(得分:0)
泛型方法的类型参数不是Type
的实例;你不能以这种方式使用你的变量。但是,您可以使用反射来创建所需的封闭通用MethodInfo
(即指定了type参数),如下所示:
// this line may need adjusting depending on whether the method you're calling is static
MethodInfo readMethod = typeof(DataReader).GetMethod("Read");
foreach (PropertyInfo info in type1.GetProperties())
{
// get a "closed" instance of the generic method using the required type
MethodInfo genericReadMethod m.MakeGenericMethod(new Type[] { info.PropertyType });
// invoke the generic method
object value = genericReadMethod.Invoke(info.Name, reader);
info.SetValue(item, value, null);
}