我一直在努力处理这种情况。我在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)>
如何在运行时使用正确类型的事实来调用函数?我假设我必须使用某种形式的反射,但是对它的理解并不足够,因此无法入门。
任何帮助将不胜感激。
总的来说,我对反射还很陌生,但是我发现它非常有趣,并且在某些方面非常困难。如果您对阅读有任何建议或关于如何更好地了解反射的任何其他技巧,那也很不错!
经过进一步思考后,编辑/更新:
仅使用dynamic
并以这种方式调用Invoke会更好吗?似乎可以正常工作,但这又引发了一个问题,即为什么您会经历设置反射来调用某些东西而不是简单的动态调用的更困难或更长时间的过程。
无论如何,我仍然想知道如何使用反射进行工作,很有趣
答案 0 :(得分:1)
问题是错误的,是“人为的”。是的,您可以使用反射,是的,您可以使用动态...但是要做的“正确”的事情是将签名更改为:
public (bool, object) SomeMethod(string par)
委托:
Func<string, (bool, object)>
或
public bool SomeMethod(string par, out object obj)
委托(请注意,您不能使用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<>
是引用类型,并且委托在返回类型上是相反的,因此您可以将它们“统一”为object
/ {{ 1}}(dynamic
是dynamic
,向C#编译器提供了一些信息,程序员将尝试对object
做“坏事”)
现在,您必须使用反射/ object
来访问dynamic
和Tuple<>.Item1
。
使用反射和使用Tuple<>.Item2
之间的区别在于,通过使用反射,您可以“ dynamic
”反射的一部分“缓存”,因此可以加快以后type
方法的使用, type
不会发生。
答案 1 :(得分:0)