为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
慕尼黑8549860 2019-11-23 16:11:55
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指令每次调用具有单独类型名称的方法。
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

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

可以使用仅在执行时已知的类型调用泛型方法,但您必须使用反射:

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

伊克。

您是否可以使您的调用方法变得通用,并将您的类型参数作为类型参数传递,将决策推高到堆栈的一级?

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



查看完整回答
反对 回复 2019-11-24
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

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



查看完整回答
反对 回复 2019-11-24
?
守着一只汪

TA贡献1872条经验 获得超3个赞

我不确定我是否正确理解您的问题,但您可以这样编写代码:

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

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

DoesEntityExist(myTypeInstance, ...)

这种方式您不需要显式写入类型,框架将自动从实例中超过类型。


查看完整回答
反对 回复 2019-11-24
  • 3 回答
  • 0 关注
  • 375 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信