2015-05-13 33 views
0

我有這個代碼,基本上它在「X」HttpBinding中設置了相同的屬性。如何使用Generic對象訪問不具有共同祖先的不同對象的屬性?

switch (serviceEndpoint.Binding.GetType().ToString()) 
{ 
case "System.ServiceModel.WSHttpBinding": 
    WSHttpBinding _wsBinding = (WSHttpBinding)serviceEndpoint.Binding; 
    _wsBinding.MaxBufferPoolSize = maxSize; 
    _wsBinding.MaxReceivedMessageSize = maxSize; 
    _wsBinding.OpenTimeout = timeOut; 
    _wsBinding.ReaderQuotas.MaxStringContentLength = maxSize; 
    break; 

case "System.ServiceModel.WebHttpBinding": 
    WebHttpBinding _webBinding = (WebHttpBinding)serviceEndpoint.Binding; 
    _webBinding.MaxBufferPoolSize = maxSize; 
    _webBinding.MaxBufferSize = maxSize; 
    _webBinding.MaxReceivedMessageSize = maxSize; 
    _webBinding.OpenTimeout = timeOut; 
    break; 

default: 
case "System.ServiceModel.BasicHttpBinding": 
    BasicHttpBinding _basicBinding = (BasicHttpBinding)serviceEndpoint.Binding; 
    _basicBinding.MaxBufferPoolSize = maxSize; 
    _basicBinding.MaxBufferSize = maxSize; 
    _basicBinding.MaxReceivedMessageSize = maxSize; 
    _basicBinding.OpenTimeout = timeOut; 
    break; 
} 

對象serviceEndpoint.Binding可能每次都不同。

我想知道,我是否可以這樣做:

object _Binding = serviceEndpoint.Binding; 
_Binding.MaxBufferPoolSize = maxSize; 
_Binding.MaxBufferSize = maxSize; 
_Binding.MaxReceivedMessageSize = maxSize; 
_Binding.OpenTimeout = timeOut; 

但如果我把這個,我有一個錯誤,因爲我沒有得到投對象的屬性。

+1

在類型的*名稱*上做一個switch-case是* reeallly *糟糕。考慮使用'is'運算符代替:'if(serviceEndpoint.Binding是WebHttpBinding)'。或安全轉換 - 'var webBinding = serviceEndpoint.Binding as WebHttpBinding;如果(webBinding!= null)...' – dcastro

回答

0

不幸的是,這些屬性沒有在共同的祖先上定義,所以剩下的唯一方法就是使用反射。該dynamic關鍵字是一個很好的快捷方式:

dynamic binding = serviceEndpoint.Binding; 

binding.MaxBufferPoolSize = maxSize; 
binding.MaxBufferSize = maxSize; 
binding.MaxReceivedMessageSize = maxSize; 
binding.OpenTimeout = timeOut; 

但這樣做,你失去了在編譯時檢測到錯誤,投的能力。這取決於你決定是否值得。

+0

感謝您的回覆KooKiz,我嘗試使用動態關鍵字,但是當我構建這個項目時,我得到這個錯誤「找不到一個或多個編譯動態表達式所需的類型。缺少參考?「我想動態_Binding = serviceEndpoint.Binding; _Binding.MaxBufferPoolSize = maxSize; – Javysk

+0

請確保您的項目中有對「Microsoft.CSharp.dll」的引用。 http://stackoverflow.com/a/11725576/869621 –

+0

我需要這個參考,非常感謝你! – Javysk

相關問題