3

Serializable 클래스에서만 실행할 수있는 확장을 만들고 싶습니다. 당신은 제약의 속성을 사용하려면C# where 절을 사용하는 확장으로 일반적인 메소드

using System; 

namespace ConsoleApplication2 
{ 
    [Serializable] 
    public class Ser 
    { 

    } 

    public class NonSer 
    { 

    } 

    public static class Extension 
    { 
     static public T f_DeepClone<T>(this T obj) 
          where T : (SerializableAttribute) 
     { 

      return (T) obj; 
     } 
    } 

    public class Program 
    { 
     static void Main(string[] args) 
     { 
      Ser mc = new Ser(); 
      mc.f_DeepClone<Ser>(); 
      NonSer mc1 = new NonSer(); 
      mc.f_DeepClone<NonSer>(); 
     } 
    } 
} 
+0

정적 속성을 확인 할 수 - 그래서 하나를 ISerializable을 사용하여 시도하거나 코드 bzw.에서 동적 런타임 검사를 할 왜이 'obj'대신 'this object obj'를 사용해야할까요? – Carsten

+0

속성은 리플렉션을 통해서만 확인할 수 있습니다. 클래스는 실제로 속성을 구현하지 않습니다. – Aphelion

+0

@Aphelion, Where 절을 체크인 할 방법이 없습니까? – uzay95

답변

1

속성을 기반으로 일반 유형을 제한 할 수 없습니다.

코드를 사용하면 객체가 직렬화 될 때와 그렇지 않을 때를 알 수 있습니다. 컴파일러가 당신을 보호 할 필요가 없습니다. 런타임에 확인하려면

그러나 당신은 할 수 있습니다 : 당신 AFAIK

static public T f_DeepClone<T>(this object obj) 
{ 
    if(typeof(T).IsSerializable == false) 
     throw new ArgumentException("Cannot clone non-serializable objects"); 

    // doing some serialization and deserialization 
    return (T) obj; 
} 
3

내가 다음 링크가 도움이 될 것이라고 생각 :

그러나, 당신이 할 수처럼 :

public static class Extension<T> 
{ 
    static public T f_DeepClone<T>(this object obj) where T: ISerializable 
    { 
     // doing some serialization and deserialization 
     return (T) obj; 
    } 
} 
+0

모든 직렬화 가능 클래스가 인터페이스를 구현하지 않습니다. – Aphelion

+0

@Aphelion, 고맙습니다. 답변을 업데이트했습니다! –

1

당신이 제안처럼 당신은 속성을 테스트 할 수 있지만 인터페이스를 테스트 할 수 :

public static class Extension 
{ 
    static public ISerializable f_DeepClone(this ISerializable obj) 
    { 
     // doing some serialization and deserialization 
     return (T) obj; 
    } 
} 
관련 문제