如何调用类型T的方法传递T作为字符串或“T”

时间:2012-08-05 16:08:51

标签: c#

我有类似的东西

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

这里的问题是我只能得到学生 来自某个将使用此代码的字符串(“Student”) 任何其他解决方案来做到这一点?

3 个答案:

答案 0 :(得分: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获取类型适用于此处(在许多情况下,它无法找到您的自定义类型)。

答案 1 :(得分:4)

不,你不能这样做。只有在编译时已知类型时才应使用泛型。这就是泛型的全部要点:强制编译时的安全性。如果在编译时不知道类型,就像你的情况一样,你可以使用Reflection或其他一些技术,具体取决于你想要实现的目标。

答案 2 :(得分:0)

除了Darin的回答:如果没有为指定的类型编译该函数(仅仅因为它从未明确地为此类型调用),则代码根本不可用。