2012-08-05 43 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的答案中还有一个附加说明:如果该函数未针对指定类型进行编译(仅因为它从未明确地针对此类型调用),则该代码根本不可用。

相关问题