1

Constraints他のオブジェクトが従わなければならない一連のルールを取得するオブジェクトがあります。

constraintsGetEnumValueRange<T>()whereTは Enum の型であるというメソッドがあります。

たとえば、列挙型を次のように定義できます。

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

次に、特定のコンテキスト内で有効な値の範囲を取得できますBoxWithAHook

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

問題は、この作業を行うためにリフレクションを使用しようとしていることです。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>(); 

しかし、明らかにそうではありません

4

2 に答える 2

2

ここから少し反省する必要があるかもしれませんMethodInfo

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

    // ...
}
于 2012-08-08T11:38:32.333 に答える
1

GetEnumValueRangeパラメータをとるオーバーロードを作成してみませんか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)。このような使用可能な代替手段があれば、個人的には反省を避けたいと思います。

于 2012-08-08T11:46:13.293 に答える