获取自身中包含的方法的所有静态实例

时间:2012-07-13 18:19:15

标签: c# .net reflection

我有一个像这样设置的课程:

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的数组。

这样我就可以只在实例中添加实例,并让其他地方能够获得数组。

任何想法?

3 个答案:

答案 0 :(得分:2)

我理解你的问题的方式,你想获得给定类型的所有公共静态字段的值。以下方法正是如此:

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类中包含一个可以返回所有可用策略的方法是不够的?如果您希望将来添加新策略,只需将其添加到该方法即可。

答案 1 :(得分:0)

不确定你在问什么;但听起来你想要检查FieldInfo.FieldType而不是GetValue ......

答案 2 :(得分: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);