C# DynamicObject And ExpandoObject

來源:互聯網
上載者:User

在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();
}

可以看到的是我們不可以對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中的其他許多方法,實現我們動態運行時的操作。這裡就不再舉例了。通過重寫裡面的方法實現我們動態運行時的自訂動作,這樣我們可以更多的去實現自己一些動態組件。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.