• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C# 4.0 实现 Method Missing

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  Method Missing 指在我们调用一个不存在的函数时,系统将此调用转给一个我们定义的函数,一个比较典型的应用是 RoR 中的 find_by 语法:

 

 

user = User.find_by_name("tom")

 

 

  C# 4.0 并没有像 Boo 那样直接支持 Method Missing,但是通过动态对象,确实可以做到。我们通过继承 DynamicObject 并 override TryInvokeMember 方法,就可以创建出一个处理不存在的函数的类。以下的代码展示了给 DbEntry 增加动态 find_by 支持的方法:

 

 

代码
public class DynamicQuery<T> : System.Dynamic.DynamicObject where T : class, IDbObject
{
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
var ss
= binder.Name.Split(new[] { "And" }, StringSplitOptions.None);
if (ss.Length != args.Length)
{
throw new ApplicationException("The args count doesn't match method call " + binder.Name + "");
}
Condition c
= null;
for (int i = 0; i < ss.Length; i++)
{
c
&= CK.Column[ss[i]] == args[i];
}
result
= DbEntry.Context.GetObject<T>(c);
return true;
}
}

 

 

  上面的代码不是很严谨,比如使用 And 进行 Split,如果字段名是 Andriod,就会出异常,不过,只为测试是够了,下面是测试代码:

 

 

代码
public abstract class User : DbObjectModel<User>
{
public abstract string Name { get; set; }
public abstract int Age { get; set; }

public abstract User Init(string name, int age);

public static dynamic FindBy
{
get { return new DynamicQuery<User>(); }
}
}

class Program
{
static void Main(string[] args)
{
DbEntry.Context.DropAndCreate(
typeof(User));
User.New.Init(
"tom", 18).Save();
User.New.Init(
"jerry", 99).Save();
User.New.Init(
"mike", 34).Save();

var u
= User.FindBy.Name("tom");
Show(u);
u
= User.FindBy.Age(99);
Show(u);
u
= User.FindBy.NameAndAge("jerry", 27);
Show(u);
u
= User.FindBy.NameAndAge("mike", 34);
Show(u);

Console.WriteLine(
"The End");
Console.ReadLine();
}

static void Show(dynamic u)
{
if (u == null)
{
Console.WriteLine(
"<NULL>");
}
else
{
Console.WriteLine(
"Item: {0},{1},{2}", u.Id, u.Name, u.Age);
}
Console.WriteLine(
"-------------------------------------");
}
}

 

 

  运行结果:

Item: 1,tom,18
-------------------------------------
Item: 2,jerry,99
-------------------------------------
<NULL>
-------------------------------------
Item: 3,mike,34
-------------------------------------
The End

 

  和 Boo 的 Method Missing 支持相比,这种方式只能工作在动态对象上,但是我并不希望全盘动态化,所以,这里实现的 FindBy 和字段名之间有一个点,使之看起来不像 Method Missing,倒是有点像连贯接口,这一点有些不爽,但是毕竟还是提供了以前不可能实现的应用,多了更多的可能性。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C#基础知识发布时间:2022-07-14
下一篇:
让某个软件无法被操作员最小化(C#演示)发布时间:2022-07-14
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap