我想知道是否可以知道调用了哪个构造函数来创建对象的实例。 例如:
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实例的构造函数,如果该类有多个,是否可能?
感谢。
答案 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";
}
}
您也可以使用枚举。