如何将默认值设置为方法或构造函数中某个类的所有属性?
所以,我的愿望是有一个构造函数(或方法),将所有我的类属性设置为默认值。 我这里有至今:如何将默认值设置为方法或构造函数中某个类的所有属性?
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)
...?
感谢您的任何意见:)
这里的问题:
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);
这正是我一直在寻找的! :)非常感谢你 –
@MichalDvořák这是什么?你明白我为什么说你想要做的事完全是多余的吗? –
Aand,顺便说一句,因为我们谈论的是默认的运算符,为什么不会这样: var y = default(typeof(Property.GetType())) 工作吗? –
这将让任何财产的一种方式有一个默认值:
class TestClass
{
private string _myString = "default";
public string MyString {
get {
return _myString;
}
set {
_myString = value;
}
}
}
不是'public string MyString {get;组; } =“默认”;'更短? –
明确地说,不知道这是可能的。 –
@RikardAskelöf它是可能的,但只适用于默认属性('{get; set;}')。只要定义了自定义getter/setter,就必须回退到您的版本。 – Fildor
正如其他人已经提到你有一个滑坡,因为已经有系统类型的默认值。但是如果你死定了:“不,我希望字符串默认为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,并想要一个巨大的画笔笔画,确保它们都设置为空字符串,反射可能比一次一个更容易,并更新所有的构造函数。另外,您可以通过继承在多个类上重复使用它。
是什么让你觉得该属性已经被设置为默认值?你为什么认为你需要为此编写任何自定义代码?你有没有尝试过实例化一个类_without_你的构造函数逻辑来看看这些值是什么? – maccettura
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/default-values-table –