2009-04-08 6 views
6

제약 조건을 일반 메서드에 추가하여 ValueTypes, Strings 또는 Nullable 값 형식을 확인하려고합니다.ValueTypes, Strings 및 Nullable에 대한 일반 제약

문제가 있다는 것이다 :

  • 값 유형 스트럿
  • 문자열 불변 기준 유형
  • 널되어있는 값의 종류가 있지만, "S : 구조체"에서 허용되지 형 제약 .

그렇다면 이러한 유형을 허용 할 수있는 방법이 있는지 일반 직원이 알고 있습니까?

문제는 주어진 개체에 대해 이러한 유형의 속성을 나타내는 Expression<Func<T, S> 매개 변수를 허용하려고하는 것입니다.

기능은 같을 것 (어떤 이해가되지 않습니다 코드를 기록하고 내가 무엇을 찾고 아이디어 얻을 빠른 뭔가입니다) 다음

public class Person 
{ 
    public string Name {get; set;} 
    public DateTime? DOB {get; set;} 
    public int NumberOfChildren {get; set;} 
    public Car CurrentCar {get; set;} 
} 

--- 

internal void MyGenericMethod<T, S>(T myObject, Expression<Func<T, S> property){...} 

Person myPerson = new Person(); 
MyGenericMethod(myPerson, p => p.Name); //S would be a string 
MyGenericMethod(myPerson, p => p.DOB); //S would be a DateTime? 
MyGenericMethod(myPerson, p => p.NumberOfChildren); //S would be a struct 

세 가지 통화 위의 모든 허용하지만, 다음되지해야합니다 감사합니다 안톤과 마크 :

UPDATE 사전

에서

MyGenericMethod(myPerson, p => p.CurrentCar); //S would be a class and shouldn't compile 

감사합니다. MyGenericMethod에는 여분의 매개 변수를 허용하는 4 가지 다른 서명이 있습니다. 그래서 기존 4 개의 각각에 대해 3 가지 (구조체, null 가능, 문자열)를 만드는 아이디어가 마음에 들지 않습니다. 유지 관리의 악몽이 될 것입니다! 내가 가지고 올 수

답변

7

있는 유일한 방법은 세 가지 기능 (산세 Expression<> 물건)의 집합입니다 : 방법의 다양한 오버로드가 있음을 감안할 때

MyGenericFunction<T>(T t) 
    where T : struct 

MyGenericFunction<T>(T? t) 
    where T : struct 

MyGenericFunction(string s) 

UPDATE, 나는 제안 할 수 있습니다 :

class Holder 
{ 
    private object value; 

    public Holder(object value) 
    { 
     this.value = value; 
    } 

    public static implicit operator Holder(DateTime dt) 
    { 
     return new Holder(dt); 
    } 

    public static implicit operator Holder(string s) 
    { 
     return new Holder(s); 
    } 

    // Implicit conversion operators from primitive types 
} 

따라서 당신의 방법은

MyGenericMethod(Holder h); 
된다

아직도 매우 성가 시지만 그럼에도 불구하고 효과가있을 수 있습니다.

+0

'struct holder '를 정의하는 것이 합리적 일 것입니다. 그런 다음 컴파일 타임 "통사론 설탕"이됩니다. 그 목적은 무엇이 합법인지 아닌지를 지정하는 것입니다. 그러나 런타임 결과는 효율적입니다 - 클래스에 필요한 할당/가비지 콜렉션을 제거합니다. – ToolmakerSteve