2009-08-19 132 views
1

更新 對不起。我並不是說整個反思庫都沒有限制。我的意思是瘋狂緩慢* .Invoke()的東西。C#屬性系統

嗨,

我需要實現在C#中的產權制度,允許通過串

SetProperty(string name, object value); 
object GetProperty(string name); 

但是正常屬性訪問

[property_attribute()] 
return_type Property { get; set; } 

和訪問,

  1. 我不想單獨註冊每個房產。
  2. 我不想使用反射
  3. 我不想通過詞典來訪問屬性(即沒有0​​)

該方案需要一個集羣計算方案,其中我必須遠程和本地設置屬性。所有的屬性都會有一個自定義屬性,這個屬性會在初始化時被讀取。我希望獲得持續的運行時間性能。

目前,我的想法是有一個自定義的解析器/預處理程序解析/運行時編譯腳本並生成設置/獲取代碼如下:

object GetProperty(string name) 
{ 
    if(name = "blah") 
      return Property1; 
    ... 
} 
... 

不過,我將無法進行調試這個方案的代碼。任何人都可以想出解決方案嗎?

感謝

+3

如果您消除所有選項,則不需要。 – 2009-08-19 03:03:26

+0

有許多選項,他沒有消除,其中大部分涉及某種類型的代碼生成。 – LorenVS 2009-08-19 03:14:35

回答

2

你最好的選擇是在運行時生成使用System.Reflection.Emit動態方法。你會得到很好的性能,一旦你的工作正常,調試應該不成問題。 (你應該能夠依賴它的工作,我不明白爲什麼不)。

我更喜歡動態方法,因爲它不依賴於編譯時的代碼生成或屬性標記或任何類型的東西。你可以讓它在任何對象上工作,它將適用於該對象的所有公共gettable/settable屬性。

+0

有趣的想法。 – jameszhao00 2009-08-19 03:41:36

+0

+1動態方法代似乎是要走的路。如果您害怕使用'System.Reflection.Emit',我建議您使用Expression Trees(http://msdn.microsoft.com/zh-cn/library/bb397951.aspx)。在內部,他們也使用'DynamicMethod'。 – jpbochi 2009-08-19 04:15:44

+0

是的,經過測試你的DynamicMethod想法似乎是最好的。它保持原生性能,同時不需要您創建具有不同類型的所有存根代表(與上面概述的CreateDelegate選項不同) – jameszhao00 2009-08-19 04:49:11

1

您可以嘗試PostSharp來創建這些屬性並讓該類實現getter/setter接口。從技術上講,它使用反射,但它在編譯時創建程序集,所以它不是典型的System.Relfection方法。

如果您的主要焦點是遠程執行此操作,您仍然需要設置某種Web服務或WCF服務,在這種情況下您將擁有一個代理,此代理又可以使用所提到的框架來設置屬性。無論如何,Web服務固有地使用反射,所以沒有辦法繞過它。

+0

謝謝您的鏈接。我將使用通過「內部呼叫」集成到單聲道運行時的定製MPI解決方案。 – jameszhao00 2009-08-19 03:25:17

1

我認爲這將很難找到一個不使用DynamicMethod的好解決方案。

正如我在LorenVS的解答發表了評論,你可以使用DynamicMethod間接通過Expression Trees

我已經使用表達式樹實現了一個簡單的委託生成器。它位於code.google.com上,因此您可能需要查看它:LateBoundMethodFactory.cs。它仍然缺少適當的文檔,但代碼很好評論(比我通常做的要多得多)。

更新:鏈接更新

+0

不幸的是,我不認爲我可以訪問Linq。 – jameszhao00 2009-08-19 04:45:16

0

如果你不想單獨登記財產操作搜索,你可以去下面的辦法..

保護無效SetPropertyValue & LTV & GT(字符串propertyName的,V值) { ViewState [propertyName] = value; }

保護V GetPropertyValue & LTV & GT(字符串propertyName的,V NullValue屬性) { //這裏NullValue屬性可以是的String.Empty或真||假或0等.... //如果ViewState [propertyName]爲空,我們想要返回的默認值.... if(ViewState [propertyName] == null) { return nullValue; } return(V)ViewState [propertyName]; }

+0

我不想通過字典訪問屬性(即沒有PropertyTable [「abc」] = val;) – jameszhao00 2009-08-19 06:27:17