我一直在努力全神贯注地处理这种情况。我在 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)
使用此签名,您不需要反射来调用方法,也不需要反射来解析返回值。您的返回值/out
被object
里面的方法装箱了.性能仍然优于使用反射。
其他半好的候选人可能是:
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<>.Item1
和 Tuple<>.Item2
.
使用反射和使用的区别dynamic
是通过使用反射你可以“缓存” type
反射的一部分,因此加快了以后对 type
的使用方法,用 dynamic
这不会发生。
关于c# - 使用反射和运行时已知的类型调用 Func 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51470148/