1

我有这样的东西

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 作为字符串(“Student”)获取任何其他解决方案来解决这个问题?

4

3 回答 3

6

在没有看到更多代码的情况下,很难确定您是否有一个合法的用例来调用这样的方法。但无论如何,假设FunctionName包含在 class 中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# 中int或者Int32在 C# 中,但只有在编译器中被烘焙后才Int32合法)此外,关于通过 apply here 获取类型的所有常见警告(在很多情况下它不会找到您的自定义类型)。GetTypeintType.GetType

于 2012-08-05T16:15:31.530 回答
4

不,你不能那样做。仅当类型在编译时已知时,才应使用泛型。这就是泛型的全部意义:强制编译时安全。如果在编译时不知道类型,就像您的情况一样,您可以使用反射或其他一些技术,具体取决于您要实现的目标。

于 2012-08-05T16:10:21.700 回答
0

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

于 2012-08-05T16:17:44.733 回答