2012-08-08 3 views
1

다른 개체가 준수해야하는 규칙 집합을 얻는 Constraints 개체가 있습니다.반영된 컨텍스트에서 일반 메서드를 호출하려면 어떻게해야합니까?

constraintsGetEnumValueRange<T>()이라고하는 방법이 있습니다. 여기서 T은 유형 열거 형입니다.

var val = constraints.GetEnumValueRange<BoxWithAHook>();  

문제 : 다음 BoxWithAHook 위해 주어진 컨텍스트 내에서 유효한 값의 범위를 얻을 수

[Flags] 
public enum BoxWithAHook 
{ 
    None = 0, 
    Thing1 = 1, 
    Thing2 = 2, 
    ... 
    // lots of other things that might be in the box 
    ThingN = N 
} 

:

그래서 예를 들어, 나는대로 열거 정의 할 수 이 작업을 수행하기 위해 리플렉션을 사용하려고합니다. 형식이 BoxWithAHook 인 것은 지정할 수 없으므로 Enum을 확장 할 수 있습니다.

if (propertyInfo.PropertyType.BaseType == typeof(Enum)) 
{ 
    var val = constraints.GetEnumValueRange<>(); // what is the generic type here? 

    // now I can use val to get the constraint values 
} 

그것은 나를 일반적인 유형을 지정하는 가능 :이 내가 무슨의 예입니다? 이상적으로,이 작동합니다 :

constraints.GetEnumValueRange<propertyInfo.PropertyType>(); 

을하지만, 분명하지 않습니다

+0

Andrei는 ** 일반적인 메소드를 호출해야한다는 측면에서 옳습니다.하지만이 유형의 리플렉션은 * 많은 * 작업을 수행하는 경우 성능을 저하시킬 수 있습니다. 당신이 있다면, 이것을 최적화하는 방법이 있습니다. 단 한 번의 통화로 그만한 가치는 없습니다. 루카 조이드는 ** 당신이 ** 리플렉션을 사용하고 있다면 generics 기반 API를 사용하는 것이 고통 스러울 것입니다. 사실, 나는'Foo (...)'메소드를'Foo (Type type, ...)'메소드로 변경하기 위해 큰 라이브러리의 전체 코어를 다시 작성했다. 결과가 훨씬 행복해졌습니다. –

답변

2

현재 MethodInfo를 통해 반사의 조금해야 할 수도 있습니다 : 왜 GetEnumValueRange의 과부하를하지

if (propertyInfo.PropertyType.BaseType == typeof(Enum)) 
{ 
    MethodInfo method = typeof(Constraints).GetMethod("GetEnumValueRange"); 
    MethodInfo genericMethod = method.MakeGenericMethod(propertyInfo.PropertyType); 
    var val = genericMethod.Invoke(constraints, null); 

    // ... 
} 
1

을하는 Type 매개 변수를 사용하므로 다음과 같이 끝납니다.

public class Constraints 
{ 
    public IEnumerable GetEnumValueRange(Type enumType) 
    { 
     // Logic here 
    } 

    public IEnumerable<T> GetEnumValueRange<T>() 
    { 
     return GetEnumValueRange(typeof(T)).Cast<T>(); 
    } 
} 

그럼 간단히 constraints.GetEnumValueRange(propertyInfo.PropertyType)을 사용할 수 있습니다. 이와 같은 사용 가능한 대안이 있다면 개인적으로 반성을 피할 것입니다.

관련 문제