c# - 使用反射和运行时已知的类型调用 Func 对象

标签 c# casting func

我一直在努力全神贯注地处理这种情况。我在 SO 上浏览过的各种类似(但不完全相同)的问题并没有完全把我带到我想要的地方。

我的情况是 Type和一个 Func<string, (bool, T)> 类型的对象其中 T 匹配 Type .我希望能够通过反射或其他方式调用它的 Invoke方法。

我有一些 Type在运行时:

Type type;

我有 Func在内存中,但作为 object :

object func;

func 的基础类型是我之前描述的。例如,如果 type代表DateTime , 然后 func的基础类型是:

Func<string, (bool, DateTime)>

但是type在运行时可以是任何东西,所以如果它是 int , 然后 func现在是一个

Func<string, (bool, int)>

我如何利用我在运行时拥有正确类型这一事实来调用我的函数?我假设我必须使用某种反射,但对它的理解还不够深入,无法开始。

非常感谢任何帮助。

总的来说,我对反射还很陌生,但我发现它非常有趣,但对某些事情来说却相当困难。如果您有任何关于阅读的建议或关于如何更好地学习反射(reflection)的任何其他技巧,那也是很好的!

编辑/更新再想一想:

只使用dynamic会更好吗?并以这种方式调用 Invoke ?看起来它会工作得很好,但随之而来的问题是,为什么您要经历更困难或更长时间的过程来设置反射来调用某些东西,而不是简单的动态调用。

无论如何,我仍然想知道如何使用反射来工作,看看会很有趣

最佳答案

问题是错误的和“人为的”。是的,您可以使用反射,是的,您可以使用动态...但是“正确”的做法是将签名更改为:

public (bool, object) SomeMethod(string par)

代表:

Func<string, (bool, object)>

public bool SomeMethod(string par, out object obj)

委托(delegate)(注意你不能使用 Func<,>/Action<,> ):

public delegate bool MyDelegate(string par, out object obj)

使用此签名,您不需要反射来调用方法,也不需要反射来解析返回值。您的返回值/outobject里面的方法装箱了.性能仍然优于使用反射。

其他半好的候选人可能是:

Tuple<bool, type> SomeMethod(string par)

(其中 type 是您的更改类型)

代表:

Func<string, object>

Func<string, dynamic>

通过使用 Tuple<bool, type>你获得了一些东西:Tuple<>是引用类型,委托(delegate)在返回类型上是逆变的,所以你可以将它们“统一”为object/dynamic (dynamic 是一个 object,向 C# 编译器提供一些信息,程序员将尝试对 object 做“坏事”)

现在你必须使用反射/dynamic访问 Tuple<>.Item1Tuple<>.Item2 .

使用反射和使用的区别dynamic是通过使用反射你可以“缓存” type反射的一部分,因此加快了以后对 type 的使用方法,用 dynamic这不会发生。

关于c# - 使用反射和运行时已知的类型调用 Func 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51470148/

相关文章:

c# - 字符串缓存。内存优化和重用

c# - 我可以在 using() 之外声明上下文并仍然调用 Dispose() 吗?

swift - 在函数中传递整数参数

c++ - 为什么#ifndef __func__ 返回真?

c# - 系统.ArgumentNullException : Value cannot be null

c# - 从 Linq 中的 Select 查询中查找索引

c++ - 重载 C++ 引用类型转换(向下转换继承)

c - 不确定为什么这个 Actor 阵容有效

list - 将 List[Any] 重新解释为 List[Int]

c# - 如何将 Func<> 属性/方法传递给 NancyFx Get() 方法?