2012-07-04 150 views
4

是否可以創建類型爲T的泛型方法,其中T是否具有特定屬性?類型T的泛型其中T具有特定屬性

例如爲:

public static XmlDocument SerializeObjectToXml<T>(T obj) 
{ 
    //... 
} 

,我想序列只能用Serializable和/或DataContract屬性的類:

[Serializable] 
[DataContract(Name = "viewModel", Namespace = "ns")] 
internal class ViewModel 
{ 
    //... 
} 
+0

你必須問,這是通用的嗎? – Jodrell

回答

6

恐怕沒有。有三種類型的約束:派生,構造函數和參考/值類型。

我相信,你應該檢查方法體中的屬性,如果可序列化對象不符合標準,則調用另一種方法來處理它。

4

也許你可以做到這一點間接地,通過創建一個基類,它有Seri​​alizable屬性和約束添加到您的泛型類,因此該類型參數應該從基類繼承:

[Serializable] 
public class MyBase {} 

public static XmlDocument SerializeToXml<T>(T obj) where T : MyBase {} 
1

靜態的,我不這麼認爲。但你可以在運行時檢查T型:

var isDataContract = typeof(T).GetCustomAttributes(typeof(DataContractAttribute), true).Any(); 
if (!isDataContract) throw new InvalidOperationException("You can only serialize classes that are marked as data contracts."); 
//... continue serialization 
+0

爲什麼需要.Cast <>。Any()?由於您在GetCustomAttributes()調用中指定了'DataContractAttribute',所以返回的對象[]的長度不應該大於0? – luke

+0

@luke你是對的 –