我有类似的东西
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”) 任何其他解决方案来做到这一点?
答案 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#中的int
或Int32
,但只有Int32
对GetType
合法,因为int
被编入编译器中)此外,所有常见的警告都是通过Type.GetType
获取类型适用于此处(在许多情况下,它无法找到您的自定义类型)。
答案 1 :(得分:4)
不,你不能这样做。只有在编译时已知类型时才应使用泛型。这就是泛型的全部要点:强制编译时的安全性。如果在编译时不知道类型,就像你的情况一样,你可以使用Reflection或其他一些技术,具体取决于你想要实现的目标。
答案 2 :(得分:0)
除了Darin的回答:如果没有为指定的类型编译该函数(仅仅因为它从未明确地为此类型调用),则代码根本不可用。