猿问

C#中的泛型,使用变量类型作为参数

C#中的泛型,使用变量类型作为参数

我有一个通用的方法

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

如何以下列方式使用该方法:

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

我一直收到愚蠢的编译错误:

找不到类型或命名空间名称't'(您是否缺少using指令或程序集引用?)

DoesEntityExist<MyType>(entityGuid, transaction);

完美的工作,但我不想使用if指令每次调用具有单独类型名称的方法。


慕尼黑8549860
浏览 376回答 3
3回答

慕容3067478

关于泛型的观点是给出编译时类型安全性 - 这意味着需要在编译时知道类型。您可以使用仅在执行时已知的类型调用泛型方法,但您必须使用反射://&nbsp;For&nbsp;non-public&nbsp;methods,&nbsp;you'll&nbsp;need&nbsp;to&nbsp;specify&nbsp;binding&nbsp;flags&nbsp;tooMethodInfo&nbsp;method&nbsp;=&nbsp;GetType().GetMethod("DoesEntityExist") &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.MakeGenericMethod(new&nbsp;Type[]&nbsp;{&nbsp;t&nbsp;});method.Invoke(this,&nbsp;new&nbsp;object[]&nbsp;{&nbsp;entityGuid,&nbsp;transaction&nbsp;});伊克。您是否可以使您的调用方法变得通用,并将您的类型参数作为类型参数传递,将决策推高到堆栈的一级?如果您可以向我们提供有关您正在做的事情的更多信息,那将有所帮助。有时您可能需要使用上面的反射,但是如果您选择正确的点,那么您可以确保只需要执行一次,并让低于该点的所有内容以正常方式使用type参数。

缥缈止盈

解决这个问题的一种方法是使用隐式转换:bool&nbsp;DoesEntityExist<T>(T&nbsp;entity,&nbsp;Guid&nbsp;guid,&nbsp;ITransaction&nbsp;transaction)&nbsp;where&nbsp;T&nbsp;:&nbsp;IGloballyIdentifiable;这样称呼它:DoesEntityExist(entity,&nbsp;entityGuid,&nbsp;transaction);更进一步,您可以将其转换为扩展方法(它需要在静态类中声明):static&nbsp;bool&nbsp;DoesEntityExist<T>(this&nbsp;T&nbsp;entity,&nbsp;Guid&nbsp;guid,&nbsp;ITransaction&nbsp;transaction)&nbsp;where&nbsp;T&nbsp;:&nbsp;IGloballyIdentifiable;这样称呼:entity.DoesEntityExist(entityGuid,&nbsp;transaction);

守着一只汪

我不确定我是否正确理解您的问题,但您可以这样编写代码:bool DoesEntityExist<T>(T instance, ....)您可以按以下方式调用该方法:DoesEntityExist(myTypeInstance,&nbsp;...)这种方式您不需要显式写入类型,框架将自动从实例中超过类型。
随时随地看视频慕课网APP
我要回答