1
public class Foo
{
    public Foo(){ }

    //One of many properties 
    //set up in the same way
    private String _name;
    public String Name 
    { 
        get { return _name; }
        set {
            _name = value;
            //code that is important to run
            //only after the objects initial creation   
        }
    }

    private int _id;
    public int ID 
    { 
        get { return _id; }
        set {
            _id = value;
            //code that is important to run
            //only after the objects initial creation   
        }
    }

    public void Win()
    {
        //clean up method that wouldn't be needed
        //if I used optional parameters because
        //i would be able to set _name (and all the
        //other private properties directly without
        //using the public Set
    }
}

在c#中创建这种对象后如何自动调用方法

Foo ko = new Foo() {
    ID = 4,
    Name = "Chair"
};
ko.Win(); // <-- Want this to be called automatically inside the class
4

4 回答 4

2

在设置了一些随机属性集后,没有自动调用的方法(初始化被转换为......)

var foo = new Foo { Name = "bar" };

实际上是快捷方式:

var foo = new Foo();
foo.Name = "bar";

当以第二种形式编写时,人们不会期望在foo.Name赋值后调用任何神奇的方法。

您的选择:

  • 如果您有一些需要在属性更改时设置的信息 - 只需将其设为属性并在其中编写代码即可set
  • 如果您必须在对象被视为“已创建”构造函数参数之前配置特定的一组属性,这是一种合理的强制执行方式。
  • 您还可以实现允许您延迟最终构造的构建器模式(或使用其他一些在最终对象创建之前强制设置参数的工厂方法。

具有构建器模式的代码示例:

 var foo = new FooBuilder { Name = "bar" }
    .Build();
于 2013-03-29T19:42:33.173 回答
0

将 Win() 添加到构造函数。调用/放入构造函数中。

public Foo(string value, string value2) {
Value = value;
Value2 = valu2e;

Win();
}

这是构造函数。手动设置。

于 2013-03-29T19:25:52.883 回答
0

那么如果你总是设置 ID 和名称呢?

private string _Name;

    public string Name
    {
        get { return _Name; }
        set {
            _Name = value;
            this.Win();
        }
    }

在您为名称设置值后,将始终调用 Win 函数,或者您可以为您选择的 ID 执行此操作!

于 2013-03-29T19:39:47.660 回答
0

不是最具可扩展性的解决方案,但为什么不试试这个:

public class Foo
{
    public int ID { get; set; }
    public String Name { get; set; }

public Foo()
{
}

public Foo( int id )
{
// Win()
ID = id;
// Win()
}

Public Foo( string name )
{
// Win()
Name = name;
// Win()
}

public Foo( int id, string name )
{
// Win()
ID = id;
Name = name;
// Win()
}

    public void Win()
    {
        //Do Stuff that would go into the constructor
        //if I wanted to use optional parameters
        //but I don't
    }
}

您可以Win在设置属性之前或之后调用。

于 2013-03-29T19:42:55.513 回答