C# 如何为方法或构造函数中类的所有属性设置默认值?

C# 如何为方法或构造函数中类的所有属性设置默认值?,c#,reflection,types,properties,C#,Reflection,Types,Properties,因此,我希望有一个构造函数(或方法),将我的所有类属性设置为默认值。 到目前为止,我已经做到了: class TestClass { public enum MyEnum { En1, En2, En3} public string MyString { get; set; } public int MyInt { get; set; } public MyEnum MyEnums { get; set; } public TestClass()

因此,我希望有一个构造函数(或方法),将我的所有类属性设置为默认值。 到目前为止,我已经做到了:

class TestClass
{
    public enum MyEnum { En1, En2, En3}
    public string MyString { get; set; }
    public int MyInt { get; set; }
    public MyEnum MyEnums { get; set; }
    public TestClass()
    {
        var Properties = this.GetType().GetProperties();
        foreach (var Property in Properties)
        {
            Property.SetValue(this,default(Property.GetType()));
        }           
    }
}
我得到了这个错误:“'Property'是一个变量,但像类型一样使用”(CS0118)。 我知道我可以为此使用struct。但真的有可能这样做吗?或者我必须为每一处房产写下如下内容:
MyString=default(string)
MyInt=default(int)

谢谢你的建议:)

问题是:

default(Property.GetType())
希望您给它一个类型,而不是
type
类的实例。这是有效的,例如:

var x = default(String);
但这并不是:

var y = default(typeof(String));
您实际上根本不需要执行您正在执行的操作。只需保留默认值即可。在构造函数执行时,编译器已经处理好了它。实际上,在已知所有属性都未显式初始化的特定情况下,获取属性默认值的最简单方法是获取它已经具有的任何值:

这毫无意义:“让它成为现在的样子”。但这正是您的代码试图做的,因为每个属性已经具有的未初始化值就是您希望分配给它的值

添加大量旋转、浪费时间、完全不做任何事情的代码是个坏主意。

但如果您确实需要这样做(我不能过分强调您不需要这样做),您可以通过以下方式来实现:


这是允许任何属性具有默认值的一种方法:

class TestClass
    {
        private string _myString = "default";
        public string MyString {
            get {
                return _myString;
            }

            set {
                _myString = value;
            }
        }
    }

因此,正如其他人所提到的,由于已经存在系统类型的默认值,您将面临一个滑坡。但如果你一意孤行地说:“不,我希望字符串默认为null以外的值并为空!”(我实际上为一个疯狂地删除null的家伙工作过)。我将分两部分来做,使其成为可选的,并继承一个抽象类,该类可以在它的基本构造函数上调用,以使用反射来获取给定类型的所有对象。在我的示例中,我使用字符串

基本示例:

public abstract class Base_Setter
{
  public Base_Setter() { }

  public Base_Setter(string overrideValue)
  {
    foreach (var property in GetType().GetProperties())
    {
      if(property.PropertyType == typeof(string))
      {
        property.SetValue(this, overrideValue);
      }
    }
  }
}
实施示例:

public class Setter : Base_Setter
{
  public Setter() {}

  public Setter(string overrideValue) 
    : base(overrideValue)  { }

  public string Description { get; set; }
  public string Notes { get; set; }  
}
用法示例:

static void Main(string[] args)
{
  Setter usesSetup = new Setter(String.Empty);
  Setter usesNone = new Setter();

  Console.ReadLine();
}

然后将给定类型的所有对象设置为您可以选择的特定设置。或者,如果你说:“这很好,但我希望它硬编码为只执行字符串清空”,你可以很容易地取出参数并修复它,或者创建另一个称为“AllStringPenttlesBase”或类似的基。同样,这并不总是推荐的,但是如果您有一组庞大的POCO,并且希望使用一个巨大的笔刷笔划确保它们都设置为字符串空,那么反射可能比一次一个地遍历和更新所有构造函数更容易。另外,您可以通过继承在多个类上重用它

是什么让您认为该属性尚未设置为默认值?为什么您认为需要为此编写自定义代码?您是否尝试过在没有构造函数逻辑的情况下实例化一个类来查看值是什么?这不是
公共字符串MyString{get;set;}=“default”
shorter?确切地说,我不知道这是可能的。@RikardAskelöf这是可能的,但只适用于默认属性(
{get;set;}
)。一旦定义了自定义getter/setter,您就必须返回到您的版本。同意,任何对数据的操作当然只能在自定义getter/setter下工作。这正是我一直在寻找的!)多谢各位much@MichalDvořák哪一个是?你明白我为什么说你要做的是完全冗余的吗?顺便说一下,当我们谈论默认操作符时,为什么像:var y=default(typeof(Property.GetType())这样的东西不起作用?是的,这看起来是冗余的,但我只是想知道,如果有一种方法可以循环遍历某个类的属性并将值设置为某个值,我通常可以对所有类型都这样做(即,类型的默认值)。也许在构造函数中这样做是没有用的,也许我希望在我的类被大量属性弄得一团糟之后有一个像“void SetEverythingToDefault”这样的方法。我没有真正的用途。@MichalDvořák
Type
类的实例不是类型
typeof(String)
相同;它与
String
有很大不同<代码>新字符串()
编译<代码>新类型(字符串)不编译。
public class Setter : Base_Setter
{
  public Setter() {}

  public Setter(string overrideValue) 
    : base(overrideValue)  { }

  public string Description { get; set; }
  public string Notes { get; set; }  
}
static void Main(string[] args)
{
  Setter usesSetup = new Setter(String.Empty);
  Setter usesNone = new Setter();

  Console.ReadLine();
}