类型为T的通用,其中T具有特定属性

时间:2012-07-04 07:54:15

标签: c# generics attributes serializable

是否可以创建T类型的通用方法,其中T具有特定属性?

E.g:

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

我想仅序列化具有Serializable和/或DataContract属性的类:

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

3 个答案:

答案 0 :(得分:9)

我害怕不。有三种类型的约束:派生,构造函数和引用/值类型。

我相信,您应该检查方法体中的属性,如果可序列化对象不符合条件,则调用另一种方法来处理它。

答案 1 :(得分:5)

也许你可以通过创建一个具有Seri​​alizable属性的基类来间接地做到这一点,并为你的泛型类添加一个约束,以便type-parameter应该从该基类继承:

[Serializable]
public class MyBase {}

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

答案 2 :(得分: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