2013-07-31 27 views
0

我有一個C#項目用作Visual Studio擴展的一部分。在C#中爲多個版本的.NET更改對象屬性

爲了支持早期版本的VS,項目設置爲Target framework .NET Framework 3.5。

該項目參考System.ServiceModel

根據運行的是哪個版本的Visual Studio,將使用不同版本的System.ServiceModel。無論項目目標框架如何,VS2008都將使用.NET 3.5版本的DLL,而VS2012將在運行時使用.NET 4.5版本。

我的問題是一個屬性被添加到.NET 4中的HttpTransportBindingElement,被稱爲DecompressionEnabled。因爲我的目標是.NET 3.5,所以無法編譯對此屬性的更改;但是,我確實需要改變它的價值。

圍繞我使用在運行時更改屬性的工作,是利用反射:

public static void DisableDecompression(this HttpTransportBindingElement bindingElement) 
{ 
var prop = bindingElement.GetType() 
         .GetProperty("DecompressionEnabled", 
             BindingFlags.Public | BindingFlags.Instance); 
if (null != prop && prop.CanWrite) 
{ 
    prop.SetValue(bindingElement, false, null); 
} 
} 

解決方案的工作,但我不知道是否有處理這個更好的設計模式,不需要反思。

+0

您是否考慮將此功能移至擴展方法?這將簡化訪問並顯着減少代碼氣味。 –

+0

是的,它已經是一個擴展方法(請參閱方法定義)。 –

+0

哎呀......我的意思是:「你是否考慮過改變它,以便該方法將屬性名稱和值作爲參數,以便您不需要8個不同的擴展名?」 –

回答

1

請參見:Detect target framework version at compile time

public static void DisableDecompression(this HttpTransportBindingElement bindingElement) 
    { 
#if RUNNING_ON_4 
     bindingElement.DecompressionEnabled = false; 
#endif 
    } 

一旦建立將發佈的.NET,然後3.5 DisableDecompression所有引用將被優化掉。

+0

不幸的是,這並不能真正解決問題。問題是引用的庫在運行時可能是不同的版本。構建始終設置爲3.5,但需要能夠使用引用庫中較高版本類的API中的屬性。 –

+2

如果您使用該方法,則反射可能是答案。 – Romoku

+0

我認爲你是對的@Romoku,它似乎是最可行的解決方案。我可能會爲不同的.NET版本編寫不同的項目彙編......但這很可能會增加更多的複雜性。 –