C# 如何知道调用了哪个构造函数来创建对象实例
我想知道是否有可能知道调用了哪个构造函数来创建对象的实例。 例如:C# 如何知道调用了哪个构造函数来创建对象实例,c#,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) {
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实例,如果类有多个实例,是否可能
谢谢。如果您想知道在运行时,您可以在此对象中设置一个标志。如果在调试中-在两个构造函数中设置断点
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";
}
}
您也可以使用enum。如果您想知道在运行时,您可以在此对象中设置一个标志。如果在调试中-在两个构造函数中设置断点
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";
}
}
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;
}
您也可以使用enum。不,这是不可能的,也不必知道调用了哪个构造函数。如果你在那个构造器中,你已经知道你在哪里了。如果你在校准代码中,你也知道你调用了什么构造函数
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;
}
可以将相关信息存储在变量中。例如:
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
。然后您可以使用if(dog.Age.HasValue)
否,这是不可能的,也不需要知道调用了哪个构造函数。如果你在那个构造器中,你已经知道你在哪里了。如果你在校准代码中,你也知道你调用了什么构造函数
可以将相关信息存储在变量中。例如:
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
。然后您可以使用if(dog.Age.HasValue)
为什么您想知道这一点?只需在调用的构造函数上设置bool值,如果您自己不记录该信息,这是不可行的。如果你一定要知道,这本身可能是个坏兆头。(我还强烈建议您不要使用公共字段…)您是否认为每个对象都应该在其整个生命周期中跟踪所有事件,以防以后有人想要访问其中的一些信息?(即,您想知道哪个构造函数,我想知道名称
属性是否已被访问,等等)。你不认为这将有一个令人难以置信的数额的开销,只是在关闭的机会,有人想获得该数据?请使用ctor链接!为什么你想知道呢?只要在构造函数calledNo上设置bool值,如果不自己记录这些信息是不可行的。如果你一定要知道,这本身可能是个坏兆头。(我还强烈建议您不要使用公共字段…)您是否认为每个对象都应该在其整个生命周期中跟踪所有事件,以防以后有人想要访问其中的一些信息?(即,您想知道哪个构造函数,我想知道名称
属性是否已被访问,等等)。你不认为这将有一个令人难以置信的数额的开销,只是在关闭的机会,有人想获得该数据?请使用ctor链接!您不应该以这种方式使用字符串,而应该使用枚举。它的效率更高,更易于使用和阅读,也更难搞乱。你可以使用浮点文本,比如40.6表示狗,34.7表示猫。它们更紧凑,但更难比较您不应该以这种方式使用字符串,而是使用枚举。它的效率更高,更易于使用和阅读,也更难搞乱。你可以使用浮点文本,比如40.6表示狗,34.7表示猫。它们更紧凑,更难比较。您是否见过UsedConstructor
-enum?不我也没有。原因只有一个:这是个坏主意。没有人需要知道您使用了什么构造函数。相反,最好添加像IsAgeKnown
这样的属性,或者将其设置为Nullable
,以区分未初始化的年龄和已初始化的年龄。如果这个属性是公共的,并且有一个setter,你也可以直接修改它们,而不需要构造函数,这会使枚举变得无用。我不知道他会给它带来什么用途。不在乎。这是我对他的问题的回答。如您所见,该属性是只读的。如果目的(我不知道)是为了知道是否分配了年龄,那么您的解决方案是正确的。您是否见过UsedConstructor
-enum?不我也没有。原因只有一个:这是个坏主意。没有人需要知道您使用了什么构造函数。相反,最好添加像IsAgeKnown
这样的属性,或者将其设置为Nullable
,以区分未初始化的年龄和已初始化的年龄。如果这个属性是公共的,并且有一个setter,你也可以直接修改它们,而不需要构造函数,这会使枚举变得无用。我不知道他会给它带来什么用途。不在乎。这是我对他的问题的回答。如您所见,该属性是只读的。如果目的(我不知道)是想知道是否分配了年龄,那么您的解决方案是正确的。