generics在C#中,使用variables的types作为参数

我有一个通用的方法

bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable; 

我如何使用以下方法:

 Type t = entity.GetType(); DoesEntityExist<t>(entityGuid, transaction); 

我不断收到错误的编译错误:

types或名称空间名称“t”找不到(您是否缺lessusing指令或程序集引用?)

 DoesEntityExist<MyType>(entityGuid, transaction); 

完美的作品,但我不想使用一个if指令每次调用一个单独的types名称的方法。

关于generics的一点是要给出编译时types的安全性 – 这意味着编译时需要知道types。

可以使用只在执行时已知的types调用generics方法,但是您必须使用reflection:

 // For non-public methods, you'll need to specify binding flags too MethodInfo method = GetType().GetMethod("DoesEntityExist") .MakeGenericMethod(new Type[] { t }); method.Invoke(this, new object[] { entityGuid, transaction }); 

伊克。

你可以使你的调用方法是通用的,并传入你的types参数作为types的参数,推动一个更高的层次上的决定栈?

如果你能给我们更多关于你在做什么的信息,那将会有所帮助。 有时候你可能需要像上面那样使用reflection,但是如果你select正确的方法去做,你可以确保你只需要做一次,而让这个点以下的所有东西都以正常的方式使用types参数。

解决这个问题的一种方法是使用隐式转换:

 bool DoesEntityExist<T>(T entity, Guid guid, ITransaction transaction) where T : IGloballyIdentifiable; 

这样调用它:

 DoesEntityExist(entity, entityGuid, transaction); 

更进一步,你可以把它变成一个扩展方法(它需要在静态类中声明):

 static bool DoesEntityExist<T>(this T entity, Guid guid, ITransaction transaction) where T : IGloballyIdentifiable; 

这样调用:

 entity.DoesEntityExist(entityGuid, transaction); 

我不确定我是否正确理解你的问题,但你可以用这种方式编写你的代码:

bool DoesEntityExist<T>(T instance, ....)

您可以按以下方式调用该方法:

 DoesEntityExist(myTypeInstance, ...) 

这样你就不需要明确写出types,框架会自动从实例中取代types。

你不能用你描述的方式来使用它。 关于generics的一点是,尽pipe在“编码时间”你可能不知道它们,编译器需要能够在编译时解决它们。 为什么? 因为在这种情况下,编译器将会消失并为“open”genericstypes的每种不同用法创build一个新types(有时称为封闭genericstypes)。

换句话说,编译之后,

 DoesEntityExist<int> 

是不同的types

 DoesEntityExist<string> 

这是编译器能够在编译时types安全性之前进行的。

对于您描述的场景,您应该将该types作为可以在运行时检查的参数。

其他选项,如其他答案中提到的,是使用reflection来创build从开放types的封闭types,虽然这可能是build议在除了极端的利基情景之外,我会说。