如何知道调用哪个构造函数来创建对象实例

时间:2016-02-17 10:06:28

标签: c#

我想知道是否可以知道调用了哪个构造函数来创建对象的实例。 例如:

public class Dog
{
    public string Name;
    public int Age;

    public Dog(){}

    public Dog(string n, int age)
    {
        this.Name = n;
        this.Age = age;
    }

    public Dog(string n)
    {
        this.Name = n;
    }    
}

现在我创建一个类实例:

var dog = new Dog("pippo", 10);

现在(我想用反思)我想知道“var dog”我用来创建一个Dog实例的构造函数,如果该类有多个,是否可能?

感谢。

3 个答案:

答案 0 :(得分:3)

public enum UsedConstructor { Default, Name, NameAndAge };

public class Dog
{
    UsedConstructor UsedConstructor { get; }
    public string Name;
    public int Age;

    public Dog()
    {
        UsedConstructor = UsedConstructor.Default;
    }

    public Dog(string n, int age)
    {
        UsedConstructor = UsedConstructor.NameAndAge;
        this.Name = n;
        this.Age = age;
    }

    public Dog(string n)
    {
        UsedConstructor = UsedConstructor.Name;

        this.Name = n;
    }

答案 1 :(得分:3)

不,这是不可能的,也不必知道调用了哪个构造函数。如果你在那个构造函数中,你就知道你在哪里了。如果你在加密代码中,你也知道你调用了什么构造函数。

您可以在变量中存储相关信息。例如:

bool dogWithAge = true;
var dog = new Dog("pippo", 10);  
// ....
if(dogWithAge)
{...}
else
{...}

如果重要的是你需要知道狗是否是用年龄创建的,你也可以修改课程。

public class Dog{

 public string Name { get; set; } // use public properties not fields
 public int Age { get; set; }     // use public properties not fields

 //...
 public bool IsAgeKnown { get; set; }

  public Dog(string n, int age){
    this.IsAgeKnown = true;
    this.Name = n;
    this.Age = age;
 }
}

现在您可以随时查看该属性:if(dog.IsAgeKnown) ...

在这种情况下适用的另一种方法:使用Nullable<int>代替int。然后,您可以使用if(dog.Age.HasValue)

答案 2 :(得分:0)

如果您想知道在运行时,可以在此对象中设置标志。如果在debug中 - 在两个构造函数中设置断点。

public class Dog{

 public string Name;
 public int Age;
 public string CreatedBy;

 public Dog(){
     this.CreatedBy = "parameterless constructor";
 }

 public Dog(string n, int age){
  this.Name = n;
  this.Age = age;
  this.CreatedBy = "two parameters constructor";
 }

 public Dog(string n){
  this.Name = n;
  this.CreatedBy = "one parameter constructor";
 }    
}

您也可以使用枚举。