Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道调用了哪个构造函数来创建对象实例_C# - Fatal编程技术网

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,你也可以直接修改它们,而不需要构造函数,这会使枚举变得无用。我不知道他会给它带来什么用途。不在乎。这是我对他的问题的回答。如您所见,该属性是只读的。如果目的(我不知道)是想知道是否分配了年龄,那么您的解决方案是正确的。