在方法中,如果参数名称与对象属性名称完全匹配,是否可以“自动分配”值?
例如,假设您使用以下方法,该方法使用 MyExample 类型:
public static void Foo (string String1, string String2)
{
//rather than doing declarative assignment
MyExample example = new MyExample();
MyExample.String1 = String1;
// Some magic method, Reflection maybe?
MyExample example = SomeMethodThatLooksAtParametersAndAssigns();
}
基本上,上面的参数名称 String1 与 MyExample 对象的属性名称完全匹配。而不是一个一个地分配它们,有没有办法自动化这个?我期待从不同的方法调用Foo方法,查看调用者参数,然后执行赋值。因此,Foo或多或少是一种实用方法,与任何特定类型无关。
为了使问题更加复杂,是否可以以对每个对象/类型执行相同操作的通用方式进行操作?
答案 0 :(得分:0)
我的第一个解决方案是创建这样的东西:
public static void Foo (string string1, string string2) {
MyExample example = new MyExample();
var prop = example.GetType().GetProperty(string1, BindingFlags.Public | BindingFlags.Instance);
if(prop != null && prop.CanWrite) {
prop.SetValue(example, string1, null);
}
}
此方法将创建类型MyExample
的新实例,获取相应的属性并使用相应的值调用它。
或者如果你真的想让它更通用:
void Main()
{
Foo("x", "y");
}
public static void Foo (string string1, string string2) {
var type = Assembly.GetExecutingAssembly().GetTypes().FirstOrDefault(x => x.GetProperties().FirstOrDefault(y => y.Name == string1) != null);
var obj = Activator.CreateInstance(type);
var prop = type.GetProperty(string1, BindingFlags.Public | BindingFlags.Instance);
if(prop != null && prop.CanWrite) {
prop.SetValue(obj, string2, null);
}
Console.WriteLine ((obj as Test).x);
}
class Test {
public String x {get; set; }
}
输出:
ý
这与以前一样,但在整个程序集中搜索时,还会动态创建找到类型的新实例。