2012-07-04 1 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

Боюсь, нет. Существует 3 типа ограничений: деривация, конструктор и ссылочный/тип значений.

Я считаю, что вы должны проверить атрибуты в теле метода, и если сериализуемый объект не соответствует критериям, вызовите другой метод для его обработки.

4

Может быть, вы можете сделать это косвенно, путем создания базового класса, который имеет Serializable атрибута, и добавить ограничение на свой универсальный класс, так что тип-параметр должен наследовать от этого базового класса:

[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 <>. Любой() требуется? Поскольку вы указываете 'DataContractAttribute' в вызове GetCustomAttributes(), не должна быть достаточная проверка длины, превышающей 0 возвращаемого объекта []? – luke

+0

@ luke Вы правы –