2008-10-21 14 views

Odpowiedz

36

Nie, obawiam się, że nie. Jedyne rzeczy, które można zrobić z ograniczeniami są:

  • where T : class - T musi być typem odwołania
  • where T : struct - T musi być typem wartość inna niż pustych
  • where T : SomeClass - T musi być SomeClass lub wywodzą się z to
  • where T : ISomeInterface - T musi być ISomeInterface lub wdrożyć to
  • where T : new() - T musi mieć konstruktora bez parametrów publiczny

Możliwe są różne kombinacje, ale nie wszystkie. Nic o atrybutach.

+1

Czy "gdzie T: ISerializable" tego nie zrobi? – crdx

+1

@ user457104: To nie wymusiłoby zastosowania atrybutu, nie. –

+0

ah tak, whoops. – crdx

7

Co wiem; nie możesz tego zrobić. Czy chcesz dodać metodę "Inicjuj" lub coś podobnego?

public void Initialize<T>(T obj) 
{ 
    object[] attributes = obj.GetType().GetCustomAttributes(typeof(SerializableAttribute)); 
    if(attributes == null || attributes.Length == 0) 
      throw new InvalidOperationException("The provided object is not serializable"); 
} 

Nie testowałem tego kodu, ale mam nadzieję, że zrozumiesz mój punkt widzenia.

+2

Jeśli zamierzasz wykonać test środowiska wykonawczego, metoda IsDefined jest prostsza: http://msdn.microsoft.com/en-us/library/system.reflection.memberinfo.isdefined.aspx –

+0

Tak, miałem chociaż sprawdzanie w czasie wykonywania, ale chciał użyć ograniczenia where. Dzięki za odpowiedź i tak – juan

+0

Jon: Masz całkowitą rację w tej sprawie. Nie wiem, jak przeoczyłem metodę IsDefined, ale dziękuję za wskazanie tego! – Patrik

0

Jeśli szukasz jakiejś klasy, która można serializować, myślę, że masz pecha. Jeśli szukasz obiektów, które stworzyłeś, możesz utworzyć podstawową klasę, która jest serializowalna i każda klasa, którą chcesz wspierać, wyprowadza z niej.

0

Wiem, że jest stary, ale do sprawdzenia używam konstruktora statycznego. Później, ale pozwala rzucić błąd w czasie wykonywania.

+0

Czy możesz dodać przykład kodu? –

Powiązane problemy