首页 / C# / 使用C#中的反射调用动态方法
使用C#中的反射调用动态方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用C#中的反射调用动态方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1443字,纯文字阅读大概需要3分钟。
内容图文
![使用C#中的反射调用动态方法](/upload/InfoBanner/zyjiaocheng/756/37bb6bdc48b344afab14c67337d0f932.jpg)
我有一个基于DynamicObject的类,它动态地实现一个接口(通过TryGet *和TryInvoke *).我想调用它使用反射实现的方法.问题是它抛出了一个TargetException(Object与目标类型不匹配).
就像我说的那样,它是动态的,所以它通过一系列连接将调用作为文本转发给另一个程序,然后使用反射调用目标方法.它基本上是一个代理类.方法名称在编译时是已知的(因为接口),但是在外部调用.
typeof(ITelescope).GetMethod(Console.ReadLine()).Invoke(prox,null);
ITelescope是接口,prox是动态对象.
解决方法:
虽然您无法使用反射调用动态方法,但您可以调用DynamicObject的TryGet … / TryInvoke …方法,然后执行动态方法…
dynamic obj = new MyDyn();
Console.WriteLine(obj.Text);
string methodName = "YourDynamicMethod";
var p1 = new ParameterModifier(2);
p1[0] = false; p1[1] = true;
var args = new object[] { new MemberBinder(methodName, true), null };
var res = typeof(DynamicObject).InvokeMember(
"TryGetMember",
BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public,
null,
obj,
args,
new ParameterModifier[] { p1 },
null,
null);
var result = args[1];
public class MyDyn : DynamicObject
{
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = "#" + binder.Name + "#";
return true;
}
}
public class MemberBinder : GetMemberBinder
{
public MemberBinder(string name, bool ignoreCase) : base(name, ignoreCase)
{
}
public override DynamicMetaObject FallbackGetMember(DynamicMetaObject target, DynamicMetaObject errorSuggestion)
{
throw new NotImplementedException();
}
}
内容总结
以上是互联网集市为您收集整理的使用C#中的反射调用动态方法全部内容,希望文章能够帮你解决使用C#中的反射调用动态方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。