一尘不染

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指令以单独的类型名称调用该方法。


阅读 1098

收藏
2020-05-19

共1个答案

一尘不染

关于泛型的要点是赋予 编译时 类型安全性-这意味着需要在编译时知道类型。

可以 使用仅在执行时才知道的类型 调用通用方法,但是必须使用反射:

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

ck

您是否可以使 调用 方法成为通用方法,并将类型参数作为类型参数传递,从而将决策向上推一层?

如果您可以向我们提供有关您正在做什么的更多信息,那将会有所帮助。有时您可能需要如上所述使用反射,但是如果选择正确的点进行反射,则可以确保只需要执行一次,并让该点以下的所有内容都以常规方式使用type参数。

2020-05-19