1

次のように設定されたクラスがあります。

public class Strategy
{
    public readonly string Name;
    public readonly int Age;

    public Strategy(string Name, int Age)
    {
        this.Name = Name;
        this.Age = Age;
    }

    public static readonly Strategy CoolStrategy = new Strategy("Super Awesome", 24);
    public static readonly Strategy LameStrategy = new Strategy("Work Harder!", 14);
}

次のようなことが言えるリフレクションを使用して拡張機能を使用できるようにしたい:

Strategy[] CurrentStrategies = typeof(Strategy).GetStaticInstances<Strategy>();

そして、このクラス内にさらに静的戦略を追加すると、この拡張機能はそれらの配列を返します。したがって、この場合、CoolStrategy と LameStrategy を含む配列が返されます。

これにより、クラスにインスタンスを追加するだけで、配列を取得できる他の場所を持つことができます。

何か案は?

4

3 に答える 3

2

私があなたの質問を理解している方法では、特定のタイプのすべての public static フィールドの値を取得したいと考えています。次のメソッドはまさにそれを行います。

public static IEnumerable<T> GetStaticInstances<T>()
{
    Type typeOfInstance = typeof(T);

    IEnumerable<T> instances = typeOfInstance
        .GetFields(BindingFlags.Public | BindingFlags.Static)
        .Where(field => field.FieldType == typeOfInstance)
        .Select(field => (T)field.GetValue(null));

    return instances;
}

Strategyしかし、利用可能なすべての戦略を返すメソッドをクラスに含めるだけで十分ではないでしょうか? 将来、新しい戦略を追加したい場合は、そのメソッドに追加するだけです。

于 2012-07-14T18:46:45.123 に答える
0

何を求めているのかよくわかりません。しかし、GetValue の代わりに FieldInfo.FieldType をチェックしたいようです...

于 2012-07-13T18:22:44.790 に答える
0
public static class StrategyExtensions
{
    public static Strategy[] GetAllStrategies()
    {
        var statics = typeof (Strategy).GetFields(BindingFlags.Static | BindingFlags.Public);
        var strategies = statics.Where(f => f.FieldType == typeof (Strategy));
        var values = strategies.Select(s => s.GetValue(null));
        return values.Cast<Strategy>().ToArray();
    }
}

それから

var all = StrategyExtensions.GetAllStrategies();
foreach (var strategy in all)
    Console.WriteLine("name: {0} age: {1}", strategy.Name, strategy.Age);
于 2012-12-01T22:32:24.080 に答える