WEB开发网
开发学院软件开发C语言 [C# 4.0] 2. Dynamic (2) 阅读

[C# 4.0] 2. Dynamic (2)

 2010-09-30 21:04:19 来源:WEB开发网   
核心提示: 输出:123Hello,World!A=123Y=abc由于 DynamicObject 默认没有实现操作,因此在上面例子中我们得自己折腾,[C# 4.0] 2. Dynamic (2)(2),publicclassDynamicObject:IDynamicMetaObjectProvider

输出:

123
Hello, World!
A=123
Y=abc

由于 DynamicObject 默认没有实现操作,因此在上面例子中我们得自己折腾。

public class DynamicObject : IDynamicMetaObjectProvider
{
  public virtual bool TryGetMember(GetMemberBinder binder, out object result)
  {
    result = null;
    return false;
  } 
  ... ...
}

当然,如果嫌麻烦,可以考虑用下面这种方式。

dynamic o = new ExpandoObject();
o.Test = new Func<int, string, string>((a, y) => String.Format("A={0}\r\nY={1}", a, y));
o.X = 123;
o.Y = "Hello, World!";
var s = o.Test(123, "abc");
Console.WriteLine(o.X);
Console.WriteLine(o.Y);
Console.WriteLine(s);

和 JavaScript、Python 之类的动态语言很像吧。我们还可以对其成员进行增删和遍历操作,还记得 Python 中的 dir() 吧。

dynamic o = new ExpandoObject();
o.Test = new Func<int, string, string>((a, y) => String.Format("A={0}\r\nY={1}", a, y));
o.X = 123;
o.Y = "Hello, World!";
// 遍历成员
var dict = o as IDictionary<string, object>;
Console.WriteLine(String.Join(", ", dict.Keys));
// 移除成员
dict.Remove("Y");
try
{
  Console.WriteLine(o.Y);
}
catch (RuntimeBinderException ex)
{
  Console.WriteLine(ex.Message);
}

Tags:Dynamic

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接