怎么实现调用某个类不存在的方法,返回指定方法?

ksn520 2014-04-12 10:03:33
例:
class a{
object Method1(){
return new object();
}
}

调用时:
object o = a.test(); //正常情况下会抛出异常

想要实现的是o = Method1() 返回的值

不考虑编译不通过问题,因为是通过其它方式调用,如反射?

能实现吗?
...全文
258 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
即使你使用糟糕的“动态语言”,你写出的程序也要尽量确保提前检查过类型和接,尽量按照规范的一些设计模式编程,尽量不要说什么“明知道不存在,我偏要调用”这种奇怪的逻辑。
tcmakebest 2014-04-13
  • 打赏
  • 举报
回复
编译都通不过,如何运行抛异常啊
  • 打赏
  • 举报
回复
“不存在”还要执行,这是闹什么鬼呢?这种程序我是不会保留,都要求删掉。
btman52 2014-04-13
  • 打赏
  • 举报
回复
是写脚本解释器吧,试试System.Runtime.InteropServices.Expando.IExpando或System.Reflection.IReflect接口。 像你所说的这种情况只要让a实现IReflect接口并重写GetMethod方法,调用a的方法的实现改为调用IReflect.GetMethod获取MethodInfo,并反射调用。 伪代码如下:

class a:IReflect
{
  private MethodInfo _default=null;
  public override MethodInfo GetMethod(string name,BindingFlags flag)
  {
    MethodInfo mi=null;
    try{mi=typeof(a).GetMethod(name,flag);}catch{}
    if(mi!=null)
    {
      return mi;
    }else{
      if(_default-=null)
      {
        _default=this.GetType().GetMethod("DefaultMethod",BindingFlags.Public|BindingFlags.Instance);
      }
      return _default;
    }
  }
  public override object DefaultMethod(){return new Object();}
}
或者你也可以自己写个接口,获取时返回methodinfo与其对应的object,这样方便管理,再或者干脆直接返回个delegate。
showjim 2014-04-12
  • 打赏
  • 举报
回复
a.XXX是静态方法
        class a
        {
            public static object Method1()
            {
                return new object();
            }
        }
            System.Reflection.MethodInfo method = typeof(a).GetMethod("test", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic, null, new Type[] { }, null);
            object o = method != null ? method.Invoke(null, null) : a.Method1();
showjim 2014-04-12
  • 打赏
  • 举报
回复
这样?
            System.Reflection.MethodInfo method = typeof(a).GetMethod("test", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic, null, new Type[] { }, null);
            object o = method != null ? method.Invoke(null, null) : null;
ksn520 2014-04-12
  • 打赏
  • 举报
回复
必须使用2.0的程序有办法吗? 补充: 1、不考虑编译不通过问题,因为是通过其它方式调用,如反射? 2、不能使用
try{
	object o = a.test();
}
catch(){
	object o = a.Method1();
}
threenewbee 2014-04-12
  • 打赏
  • 举报
回复
用ExpendroObject,.NET 4.0以上支持。

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧