2013-01-02 1 views
1

here과 비슷한 유형의 세이프 메소드와 비슷한 방식으로 내 ViewModelBaseClass에 사용자 정의 Get/SetValue (INotifyPropertyChanged) 도우미 함수를 추가하기로 결정했습니다. 하지만 기본 초기화가있는 도우미 함수에 선택적 이니셜 라이저를 추가하려고합니다. 불행히도 default 키워드는 참조 유형을 null, null 값 유형을 null로, 값 유형을 기본값으로 초기화합니다.게이터 도우미에 대한 기본 이니셜 라이저 오버로드를 허용하는 방법

형식에 대한 기본값을 반환하는 Get 도우미, Nullable (가능한 경우)에 대한 BaseType의 기본값 값 및 기본 생성자가있는 참조 형식의 기본 생성자에서 호출하는 제네릭 함수를 만들고 싶습니다. 생성자를 구현하지 않는 참조 유형의 경우 null을 반환 할 수 있습니다. 그러나 새로운 T()와 디폴트 (T)를 호출하는 방법을 찾는 것이 어렵다면, 컴파일러는 올바른 제약 조건이 없다고 말합니다 (물론 제약 조건은 런타임에 검사되기 때문에). 내가 존 소총의 http://msmvps.com/blogs/jon_skeet/archive/2010/11/02/evil-code-overload-resolution-workaround.aspx 그는 말했다 ( 있는 가져 오기 도우미 메서드에 사용할 수있는 가정 대안으로

:.

이것은 아마도 내가 쓴 가장 끔찍한 코드를

실제 생활에서 사용하지 마십시오 제발, 제발. 그런 이나 뭐 다른 방법 이름을 사용합니다. 을 아직도, 그것은, 그것은 재미있는 작은 퍼즐 그렇지?

)을 사용하면 기본 생성자없이 참조 형식을 강제로 지정하여 비 선택적 init Func를 지정할 수 있습니다.

답변

1

이 방법을 시도해 볼 수 있습니다. 기본 유형의 null 허용 가능 유형에 대한 기본값을 반환하는 더 좋은 방법을 찾지 못했습니다. 나는 뭔가를 찾으면 계속 내 게시물을 찾고 업데이트 할 것이다. 그러나 매개 변수없는 생성자없이 참조 형식을 전달할 수는 없습니다.

static T GetDefault<T>() where T : new() 
{ 
    var type = typeof (T); 
    var underlying = Nullable.GetUnderlyingType(type); 
    if (underlying != null) 
     return (T) Activator.CreateInstance(underlying); 
    return new T(); 
} 

양자 택일로, 당신은 그 이유로, 모든 경우에 반사를 사용하고있는 new() contraint, 느린없이이 버전을 사용할 수 있습니다.

static T GetDefault<T>() 
{ 
    var type = typeof (T); 
    var underlying = Nullable.GetUnderlyingType(type); 
    if (underlying != null) 
     return (T) Activator.CreateInstance(underlying); 
    var constructor = type.GetConstructor(Type.EmptyTypes); 
    return (T) (constructor == null ? default(T) : Activator.CreateInstance(type)); 
}