1

编辑:我试图在里面运行它的类/方法是静态的,因此我无法将它传递给 generic.Invoke

我有一个静态数据访问类,用于自动解析来自各种来源的数据。当我遇到问题时,我开始重新考虑它。我想通过反射将类型传递给通用方法,(该方法然后解析类型并返回带有值的类型)我的代码目前看起来像

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);
}
4

2 回答 2

2

我猜DataReader.Read是静态方法吧?

因此,如下所示更改错误行,因为您正在调用静态方法。没有对象,所以你只需传入null方法Invoke

var value = generic.Invoke( null, new object[] {info.Name, reader} );
于 2013-03-22T15:47:56.127 回答
0

泛型方法的类型参数不是 ; 的实例Type。你不能以这种方式使用你的变量。但是,您可以使用反射来创建您需要的封闭泛型MethodInfo(即,指定类型参数),它看起来像这样:

// 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);
}
于 2013-03-22T15:25:13.977 回答