2012-07-04 100 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你是对的 –