2013-03-22 110 views
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); 
} 
+0

的可能重複(http://stackoverflow.com/questions/232535/how-to次使用反射到呼叫通用方法) – 2013-03-22 15:22:52

回答

2

我猜DataReader.Read是靜態方法,對嗎?

因此,如下所示更改錯誤行,因爲您正在調用靜態方法。沒有對象,所以你只是通過nullInvoke方法:?如何使用反射來調用通用方法]

var value = generic.Invoke(null, new object[] {info.Name, reader}); 
0

type參數到一個通用的方法不是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); 
}