我有一个像这样设置的课程:
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的数组。
这样我就可以只在实例中添加实例,并让其他地方能够获得数组。
任何想法?
答案 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);