2016-08-10 2 views
0

C# 컴파일러 오류 CS1061을 조사했지만이 코드에서 생성 된 오류를 해결하는 방법을 모르겠습니다. 제네릭 형식을 사용하는 범용 TypeConverter 클래스를 디자인하려고합니다.범용 C# TypeConverter를 구현하는 방법은 무엇입니까?

먼저 확장 가능한 속성으로 사용할 클래스를 정의합니다. TypeConverter가 호출 할 정적 메서드 'ConvertFromString'이 있습니다.

[TypeConverter(typeof(MyClassConverter))] 
public class MyClass 
{ 
    ... 
    public static MyClass ConvertFromString(string s, MyClass OldValue) 
    { 
    ... 
    } 
} 

나는이 같은 TypeConverter를 정의하고 싶습니다,이 범용 MyClassConverter도 정적 ConvertFromString 방법을 제공하는 다른 클래스에서 사용할 수 있도록하는 것이

public class MyClassConverter<T> : ExpandableObjectConverter 
{ 
    ... 
    public override object ConvertFrom(ITypeDescriptorContext context, 
            CultureInfo culture, object value) 
    { 
    GridItem gridItem = context as GridItem; 
    object itemValue = gridItem == null ? null : gridItem.Value; 

    if (value is string) 
     return typeof(T).ConvertFromString((string)value, (T)itemValue); 

    return base.ConvertFrom(context, culture, value); 
    } 
} 

.

내 문제는 (지금까지)

return typeof(T).ConvertFromString((string)value, (T)itemValue); 

는 컴파일러 오류 CS1061을 생성, 코드 줄 것입니다. 나는 그것을 어떻게 고쳐야하는지 잘 모르겠다.

사이드 참고 :

  1. 인가 : 난 단지

    내 질문 T.을 지정하려면이

    if (value is string && typeof(T) == typeof(MyClass)) 
        return MyClass.ConvertFromString((string)value, (MyClass)itemValue); 
    

    , 오류없이 컴파일하지만 MyClass에를 지정하지 않으 방법은 T를 사용하여 정적 메서드 ConvertFromString을 호출하는 방법?

  2. Can # 1은 ConvertFromString을 정적으로 활용할 수 있습니까?
  3. T 타입의 객체를 미리 생성하지 않고 # 2 할 수 있습니까?

현재 저는 여러 가지 사용자 정의 TypeConverter 클래스 (generics를 사용하지 않음)가 있습니다. 다른 유일한 코드 행은 ConvertFromString을 호출 한 것입니다. 각 사용자 지정 TypeConverter에서 ConvertFromString은 변환하는 적절한 클래스 이름으로 명시 적으로 하드 코드됩니다. 이 모든 사용자 지정 변환기 클래스를 하나의 범용 변환기 클래스로 바꿀 수 있다면 얼마나 좋겠습니까.

  • 이것은 가능합니까?
  • 누락 된 지식이 있습니까?

(이 솔루션은 .NET 3.5 이전 버전과 호환 가능해야합니다.)

+1

http://stackoverflow.com/questions/3384976/calling-a-static-method-using-a-type –

+0

@AlexKrupka - 감사합니다! MethodInfo 클래스와 GetMethod()를 살펴볼 것이다. – dathompson

답변

0

감사 알렉스!

예, MethodInfo/GetMethod가 누락되었습니다.

내 범용 TypeConverter를 클래스는 현재 다음과 같습니다,

public class MyClassConverter : ExpandableObjectConverter 
{ 
    ... 
    public override object ConvertFrom(ITypeDescriptorContext context, 
             CultureInfo culture, object value) 
    { 
     GridItem gridItem = context as GridItem; 
     object itemValue = gridItem == null ? null : gridItem.Value; 

     if (value is string) 
     { 
      MethodInfo m = itemValue.GetType().GetMethod("ConvertFromString"); 
      return m.Invoke(null, new object[] { value, itemValue }); 
     } 

     return base.ConvertFrom(context, culture, value); 
    } 
} 

이제 하나의 범용 TypeConverter가 클래스를 사용할 수있는 확장 속성을 가진 모든 클래스 (한이 정적 ConvertFromString 방법을 정의한다).

사용자 정의 TypeConverter 클래스를 6 개 이상 제거했습니다. 이 새로운 범용 컨버터는 내 요구에 충분하다. 단!

관련 문제