3

我有一行 C#:

cats.Add(new Cat("happy") { Mean=false})

我修改 Cat 然后应用这样的平均值:

cats.Add(Fix(new Cat("happy")) { Mean=false})

但我不能。Fix() 方法应该如何做才能使上述方法起作用?

4

3 回答 3

4

它不会那样工作。Thenew X() { }是一个初始化器,你不能通过Fix在构造函数周围调用 a 然后在结果上调用属性/字段绑定来拆分它。在调用函数之前必须评估属性/字段绑定。Fix

你必须这样做:

public Cat Fix(Cat cat) { ... }

cats.Add(Fix(new Cat("happy") { Mean=false }));

或者像这样的扩展方法:

public static class CatExtensions {
     public static Cat Fix(this Cat cat) { ... }
}

cats.Add(new Cat("happy") { Mean=false }.Fix());

或者如果你更喜欢冒险,你可以接受一个动态类型:

public Cat Fix(Cat cat, dynamic properties) { ... }

cats.Add(Fix(new Cat("happy"), new { Mean=false }));

// extension method:
public static class CatExtensions {
     public static Cat Fix(this Cat cat, dynamic properties) { ... }
}

cats.Add(new Cat("happy").Fix(new { Mean=false }));

或通用方法:

public Cat Fix<T>(Cat cat, T properties) { ... }

cats.Add(Fix(new Cat("happy"), new { Mean=false }));

// extension method:
public static class CatExtensions {
     public static Cat Fix<T>(this Cat cat, T properties) { ... }
}

cats.Add(new Cat("happy").Fix(new { Mean=false }));
于 2013-06-21T21:24:08.173 回答
1

以上是不可能的。对象初始化器只能与构造函数一起使用,不能用于任意实例。您需要创建一个临时变量:

var nonMeanCat = Fix(new Cat("happy"));
nonMeanCat.Mean = false;
cats.Add(nonMeanCat);

或者,为了支持流畅的设计,为属性添加显式访问器方法,例如IsMean()Mean(bool)

于 2013-06-21T21:24:20.817 回答
1

据我所知,您不能这样做,因为第一个语句中使用的语法称为 Object Initializer Syntax,它由 C# 直接支持并且无法扩展。一个解决方案是让该Fix方法返回Cat调用它的实例,如下所示:

public class Cat {
    public Cat Fix() {
        // DO YOUR WORK HERE
        return this;
    }

    public Cat Mean(bool meanValue) {
        Mean = meanValue;
        return this;
    }
}

然后你可以做这样的事情:

cats.Add(new Cat("Happy").Fix().Mean(meanValue));
于 2013-06-21T21:31:10.110 回答