"自动分配"参数值,如果对象属性名称等于?

时间:2014-01-08 22:54:32

标签: c#

在方法中,如果参数名称与对象属性名称完全匹配,是否可以“自动分配”值?

例如,假设您使用以下方法,该方法使用 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或多或少是一种实用方法,与任何特定类型无关。

为了使问题更加复杂,是否可以以对每个对象/类型执行相同操作的通用方式进行操作?

1 个答案:

答案 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; }
}

输出:

  

ý

这与以前一样,但在整个程序集中搜索时,还会动态创建找到类型的新实例。