2008-11-07 3 views
60

직렬화 된 값과 형식을 저장하는 클래스가 있습니다. 이미 캐스팅 된 값을 반환하는 속성/메서드가 필요합니다.일반 속성 만들기

public String Value { get; set; } 

public Type TheType { get; set; } 

public typeof(TheType) CastedValue { get { return Convert.ChangeType(Value, typeof(_Type)); } 

C#에서 가능한가요?

+4

일반 속성이 좋을 것입니다. 나는'var val = obj.Prop '이'obj.Prop [typeof] (type)]'또는'obj.GetProp ()'보다 타입 기반 룩업에 더 간결하다고 생각합니다. – Dan

답변

93

속성을 포함하는 클래스가 일반적인 경우, 그것은 가능합니다, 당신은 일반 매개 변수를 사용하여 속성을 선언 :

class Foo<TValue> { 
    public string Value { get; set; } 
    public TValue TypedValue { 
     get { 
      return (TValue)Convert.ChangeType(Value, typeof(TValue)); 
     } 
    } 
} 

대안 대신 일반적인 방법을 사용하는 것입니다 :

class Foo { 
    public string Value { get; set; } 
    public Type TheType { get; set; } 

    public T CastValue<T>() { 
     return (T)Convert.ChangeType(Value, typeof(T)); 
    } 
} 

System.ComponentModel.TypeConverter 클래스를 사용하면 클래스에서 자체 변환기를 정의 할 수 있으므로 변환 할 수 있습니다.

편집 :

Foo foo = new Foo(); 
foo.Value = "100"; 
foo.Type = typeof(int); 

int c = foo.CastValue<int>(); 

당신은 컴파일 타임에 유형을 알고있다 : 일반 메서드를 호출 할 때 컴파일러가 추론 할 방법이 없기 때문에, 당신은 제네릭 형식 매개 변수를 지정해야합니다 . 당신이 컴파일시에 유형을 모르는 경우에 당신은 어떤 경우에 당신은 Foo 클래스에 다음 속성을 추가 할 수 object에 저장해야합니다 :

public object ConvertedValue { 
    get { 
     return Convert.ChangeType(Value, Type); 
    } 
} 
+0

클래스 'Foo의 두 번째 예제에서 나는 당황 스럽다. 공용 속성'theType이 선언된다 : "public Type TheType {get; set;}"이지만 코드에서 사용되지 않는 것으로 보입니다. 고마워, – BillW

+0

속성은 원래 예제에 있습니다. 방금 그것을 안으로 둡니다. – Brannon

+0

Brannons 솔루션을 시도 할 때 런타임 오류가 나는 캐스팅 해요 IConvertible 구현해야합니다 개체를 말하는 얻을. 내가 소스를 사용할 수있는 클래스를 캐스팅하지 않으면 이것이 거래 차단기처럼 보이기 때문에 내가 잘못한 것을 했는가? – Keith

3

나는 예를 믿을 수 없어 당신 여기에 주어진 것이 가능합니다. CastedValue의 유형은 컴파일 타임에 정의되어야하며 이는 런타임 값 (TheType 속성의 값)에 의존 할 수 없음을 의미합니다.

편집 : Brannon의 솔루션에는 속성이 아닌 일반 함수를 사용하여이를 처리하는 방법에 대한 몇 가지 좋은 아이디어가 있습니다.

52

속성, 이벤트, 생성자 등은 일반 수 없습니다. 메서드와 유형 만 제네릭 일 수 있습니다. 대개의 경우 문제는 아니지만 가끔은 고통 스럽다는 데 동의합니다. Brannon의 답변은 두 가지 합리적인 해결 방법을 제공합니다.