2017-09-07 27 views
-1

所以,我的愿望是有一个构造函数(或方法),将所有我的类属性设置为默认值。 我这里有至今:如何将默认值设置为方法或构造函数中某个类的所有属性?

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())); 
     }   
    } 
} 

我收到此错误:“‘财产’是一个变量,但使用像一个类型”(CS0118)。 我知道我可以使用结构来达到这个目的。但是实际上可以做这样的事情吗?或者我将不得不写每个财产如下: MyString = default(string),MyInt = default(int) ...?

感谢您的任何意见:)

+8

是什么让你觉得该属性已经被设置为默认值?你为什么认为你需要为此编写任何自定义代码?你有没有尝试过实例化一个类_without_你的构造函数逻辑来看看这些值是什么? – maccettura

+0

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table –

回答

0

这里的问题:

default(Property.GetType()) 

The default operator要你给它一个,不是Type类的一个实例。这工作,例如:

var x = default(String); 

但这并不:

var y = default(typeof(String)); 

你实际上并不需要做的,你在做什么的。只保留默认值。编译器在构造函数执行时已经处理好了。事实上,要获得一个属性的默认值,在特定情况下,所有的属性称为不明确初始化最简单的方法,就是采取任何价值,它已经有

Property.SetValue(this, Property.GetValue(this)); 

,供应没有目的:“做到现在就是它”。但是这就是你的代码试图做的事情,因为每个属性已经有的未初始化值就是你希望赋予它的值。

这是一个坏主意,添加大量的代码,周旋转,浪费时间,并且什么都不做。

但是,如果你确实需要做到这一点(我不能过分强调你不要),则可以通过将creating an uninitialized value of the correct type做到这一点:

var type = Property.GetType(); 
var dflt = (type.IsValueType) 
       ? Activator.CreateInstance(type) 
       : null; 
Property.SetValue(this, dflt); 
+0

这正是我一直在寻找的! :)非常感谢你 –

+1

@MichalDvořák这是什么?你明白我为什么说你想要做的事完全是多余的吗? –

+0

Aand,顺便说一句,因为我们谈论的是默认的运算符,为什么不会这样: var y = default(typeof(Property.GetType())) 工作吗? –

0

这将让任何财产的一种方式有一个默认值:

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

      set { 
       _myString = value; 
      } 
     } 
    } 
+2

不是'public string MyString {get;组; } =“默认”;'更短? –

+0

明确地说,不知道这是可能的。 –

+0

@RikardAskelöf它是可能的,但只适用于默认属性('{get; set;}')。只要定义了自定义getter/setter,就必须回退到您的版本。 – Fildor

0

正如其他人已经提到你有一个滑坡,因为已经有系统类型的默认值。但是如果你死定了:“不,我希望字符串默认为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(); 
} 

这将然后设置一个给定类型的所有对象到一定设置你可以选择。或者如果你说:“这一切都很好,但我希望它被硬编码为只做空字符串”,你可以很容易地拿出参数并修复它,或者创建另一个名为“AllStringEmptiesBase”或类似的名字。同样,这并不总是被推荐,但如果你有一个庞大的POCO,并想要一个巨大的画笔笔画,确保它们都设置为空字符串,反射可能比一次一个更容易,并更新所有的构造函数。另外,您可以通过继承在多个类上重复使用它。

相关问题