public ParameterList GetStrategyParameters(string name, object obj)
{
var list = new ParameterList {
Name = name
};
var pred = new Predicate <Attribute>(a =>
{
var t = a.GetType();
return(t.FullName.Contains("ComponentModel") && t.Name != "PropertyTabAttribute" && t.Name != "ToolboxItemAttribute");
});
var properties = obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(p => p.GetCustomAttributes(typeof(ParameterAttribute), true).Any());
foreach (var param in properties.Select(p => new Parameter(p.Name, p.GetValue(obj), p.PropertyType.AssemblyQualifiedName, p.GetCustomAttributes().Where(a => pred(a)).ToArray())))
{
list.Add(param);
}
var fields = obj.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic).Where(f => f.GetCustomAttributes(typeof(ParameterAttribute), true).Any());
foreach (var param in fields.Select(f => new Parameter(f.Name, f.GetValue(obj), f.FieldType.AssemblyQualifiedName, f.GetCustomAttributes().Where(a => pred(a)).ToArray())))
{
list.Add(param);
}
var methods = obj.GetType().GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public).Where(m => m.GetCustomAttributes(typeof(StrategyMethodAttribute), true).Any() && m.GetParameters().Length == 0);
foreach (var m in methods)
{
list.Methods.Add(m.Name);
}
return(list);
}