【问题标题】:How do I set arbitrary number of properties on generic object?如何在通用对象上设置任意数量的属性?
【发布时间】:2009-09-01 21:42:59
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# lambda properties generics


    【解决方案1】:

    你可以这样做:

    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 是值类型,则对其属性的修改将丢失。

    【讨论】:

    • 将 propertySetter 更改为 Func 并返回值;返回属性Setter(值);它适用于引用类型和值类型
    • Rune FS:这样,您需要在 lambda 中使用 return 语句。我想避免这种情况。
    • 我实际上必须从 Create 中删除 才能让它在我的场景中工作,但它工作得很好。
    猜你喜欢
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 2011-08-17
    相关资源
    最近更新 更多