如何在通用对象上设置任意数量的属性?

时间:2009-09-01 21:42:59

标签: c# lambda properties generics

我希望能够调用一个创建对象的方法,并根据传递给方法的参数设置对象的属性。参数的数量是任意的,但是我不想使用字符串。我想使用像lambda表达式中那样的实际属性。

我希望能够使用可能如下所示的方法调用该方法:

controller.Create<Person>(f=>{f.Name = 'John', f.Age = 30})

或那些我使用实际属性引用(f.Name)而不是属性的字符串表示的行。

另一个规定是我不希望在方法调用之前完成任何工作。我在一个库中写这个,所以我不希望用户除了进行调用之外还要做任何事情,并返回一个对象,其属性设置为传入的值。

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

controller.Create<Person>(f => { f.Name = 'John'; f.Age = 30; })

创建方法签名将是:

public T Create<T>(Action<T> propertySetter) where T : class {
    T value = ...;
    propertySetter(value);
    return value;
}
此处不严格要求

where T : class,但如果T是值类型,则对其属性的修改将会丢失。