在Dynamic關鍵字中有童鞋提到DynamicObject了,所以就翻翻書,股溝學習下,然後做個筆記,方便以後學習使用,跟大家分享下這些基本的東西吧。。
1.ExpandoObject 表示一個對象,該對象包含可在運行時動態添加和移除的成員。,這個類是在System.Dynamic這個命名空間下,那麼肯定跟動態類型有關,這個類能做什麼呢?我們看一下下面的例子:
class Program
{
static void Main()
{
dynamic dynEO = new ExpandoObject();
dynEO.number = 20;
dynEO.MeThod = new Func<int, string>((int i) => { return (i+20).ToString(); });
Console.WriteLine(dynEO.number);
Console.WriteLine(dynEO.MeThod(dynEO.number));
Console.ReadKey();
}
}
復制代碼
從上面例子不難看出,ExpandoObject這個類是非常有用的,它可以動態添加成員變量和方法,這樣我們在寫一些對象時,不需要在new一個class那麼麻煩,只要用這個類就可以了,不過,需要注意的是,這個類是在運行時解析的,這樣我們就會帶來性能上的一些損失,而且,在編寫較復雜的邏輯時,不容易發現問題所在,所以,對於簡單的對象,我們可以使用這個類,復雜的就不要用了。
2.DynamicObject, DynamicObject跟ExpandoObject最大的區別就是,我們可以通過繼承DynamicObject,自己來決定動態對象如何執行。我們先來看下DynamicObject的定義中初始化函數:
public class DynamicObject :IDynamicMetaObjectProvider
{
protected DynamicObject();
}
www.2cto.com
可以看到的是我們不可以對DynamicObject直接實例化的,這也是DynamicObject設計的初衷,由我們自己來定義運行時的動態的成員的處理。一般的時候如果我們自定義的類型只需要處理一些動態的屬性的時候我們只需要重寫TryGetMember跟TrySetMember方法。
class test:DynamicObject
{
Dictionary<string, object> dic = new Dictionary<string, object>();
/*這裡重寫了TryGetMember和TrySetMember方法,繼承了DynamicObject後,可以override 一大堆TryXXX的方法了,
這個可以自動動手看看。*/
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var name = binder.Name;
Console.WriteLine("獲取{0}", name);
return dic.TryGetValue(name, out result);
}
public override bool TrySetMember(SetMemberBinder binder, object value)
{
var name = binder.Name;
dic[name] = value;
Console.WriteLine("寫入{0}={1}",name,value);
return true;
}
}
class Program
{
static void Main()
{
dynamic employee = new test();
employee.Name = "xiaobai";
employee.Age = "21";
employee.Sex = "N";
Console.WriteLine("Name:{0},Age:{1},Sex:{2}", employee.Name, employee.Age, employee.Sex);
Console.ReadKey();
}
}
我們還可以重寫DynamicObject中的其他許多方法,實現我們動態運行時的操作。這裡就不再舉例了。通過重寫裡面的方法實現我們動態運行時的自定義操作,這樣我們可以更多的去實現自己一些動態的組件
作者 小小白白