2012-08-05 21 views
1

我有這樣的事情如何調用類型T的傳遞T作爲字符串或「T」的方法

public void FunctionName<T>(){ 

} 

,並呼籲這一點,你需要的是這樣的

sub main(){ 
    FunctionName<Integer>(); 
} 

我的問題是我可以通過整數作爲「整數」?

sub main(){ 
    FunctionName<"Integer">(); 
} 

或有任何其他方式向

確定這裏是我的實際代碼

private static T Convert<T>(DataRow row) where T : new() 
{ 
    T model = new T(); 
    Type modelType = model.GetType(); 
    FieldInfo[] fields = null; 
    FieldInfo field = default(FieldInfo); 
    Type fieldType = null; 
    string fieldName = null; 

    fields = modelType.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Static); 

    foreach (field in fields) { 
     fieldType = field.FieldType; 
     fieldName = field.Name.Replace("_", string.Empty); 
     Interaction.CallByName(model, fieldName, Microsoft.VisualBasic.CallType.Set, GetValue(row, fieldName, fieldType.Name)); 
    } 

    return model; 
} 


static void main(){ 
    Student s; 

    s = Convert<Student>(DatabaseRow); 
} 

這裏的問題是我只能得到學生爲 字符串(「學生」 )從某個地方,將使用此代碼 任何其他解決方案,以得到這個權利?

+5

WTF是與'子'的東西? – leppie 2012-08-05 16:11:37

+1

@泰米爾:這個問題看起來很清楚。 – 2012-08-05 16:14:05

+2

你確定你用C#編程嗎?也許你應該改變你的問題的標籤,包括實際的語言('sub'聽起來像VB) – Tipx 2012-08-05 16:19:37

回答

6

沒有看到更多的代碼,很難確定您是否擁有調用此方法的合法用例。但無論如何,假設FunctionName包含在Foo類,那麼你可以使用反射調用方法:

var foo = new Foo(); 
var typeName = "System.Int32"; 
var method = typeof(Foo).GetMethod("FunctionName"); 
var genericMethod = method.MakeGenericMethod(Type.GetType(typeName)); 
genericMethod.Invoke(foo, new Type[0]); 

請注意,我們不能用Integer,因爲這不是真正的類型名稱。 (這是在C#或者intInt32但只Int32GetType,因爲int烘焙成編譯器是合法的),而且,所有常用的注意事項有關通過Type.GetType得到一個類型適用於此處(有些情況下也不會找到你的自定義很多情況下,類型)。

4

不,你不能那樣做。只有在編譯時已知類型的情況下,才應使用泛型。這就是泛型的重點:強化編譯時安全性。如果在編譯時不知道類型,就像你的情況一樣,你可以使用Reflection或其他技術,具體取決於你想要實現的內容。

+0

這就是我想要做的。使用反射來調用該函數,但該技術將字符串返回爲類名,而不是實際的類類型 – valrecx 2012-08-05 16:55:48

0

Darin的答案中還有一個附加說明:如果該函數未針對指定類型進行編譯(僅因爲它從未明確地針對此類型調用),則該代碼根本不可用。

相關問題