C# 重写空属性的C属性
是否可以在类上添加覆盖所有空字符串属性的自定义属性?大概是这样的:C# 重写空属性的C属性,c#,.net,C#,.net,是否可以在类上添加覆盖所有空字符串属性的自定义属性?大概是这样的: [DefaultValueForEmptyString(Text="N/A")] public class PersonsDTO { public string Name { get; set; } public string Lastname { get; set; } public string Address { get; set; } } public class DefaultValueForEm
[DefaultValueForEmptyString(Text="N/A")]
public class PersonsDTO
{
public string Name { get; set; }
public string Lastname { get; set; }
public string Address { get; set; }
}
public class DefaultValueForEmptyString
{
public static void MapProperties(object Properties, string text)
{
foreach (var property in Properties)
{
if(string.IsNullOrEmpty(property))
{
property = text // "N/A in this case
}
}
}
}
为了解决多年前的类似问题,我实现了一个扩展来处理此问题:
public static string ValueOrDefault(this string value)
{
return string.IsNullOrWhiteSpace(value) ? "N/A" : value;
}
现在,您可以在所有字符串属性上使用此选项:
var person = new PersonsDTO();
//Prints N/A
Console.WriteLine(person.Name.ValueOrDefault());
这并不令人印象深刻,但工作已经完成。为了解决多年前的类似问题,我实现了一个扩展来处理此问题:
public static string ValueOrDefault(this string value)
{
return string.IsNullOrWhiteSpace(value) ? "N/A" : value;
}
现在,您可以在所有字符串属性上使用此选项:
var person = new PersonsDTO();
//Prints N/A
Console.WriteLine(person.Name.ValueOrDefault());
这并不令人印象深刻,但工作已经完成。另一个选择是创建一个自定义字符串类,隐式地将自定义类转换为字符串,并将字符串转换为自定义类。这有点繁琐,但创建自定义属性类也是如此 我制作了一个.NET小提琴,展示了一个例子 下面是代码的副本,以防.NETFiddle消失
using System;
public class DefaultString
{
private const string _default = "N/A";
public DefaultString(string normal)
{
Value = normal;
}
private string _value = _default;
public string Value
{
get
{
return _value;
}
set
{
if (String.IsNullOrEmpty(value))
_value = _default;
else
_value = value;
}
}
public bool IsDefault()
{
return Value == _default;
}
public override string ToString()
{
return Value;
}
public static implicit operator string(DefaultString defaultString)
{
if (defaultString == null)
return _default;
return defaultString.ToString();
}
public static implicit operator DefaultString(string normal)
{
return new DefaultString(normal);
}
}
public class Program
{
public static void Main()
{
DefaultString nullDefault = null;
DefaultString nullConstructorDefault = new DefaultString(null);
DefaultString emptyDefault = String.Empty;
DefaultString emptyConstructorDefault = new DefaultString(String.Empty);
DefaultString abcDefault = "abc";
DefaultString abcConstructorDefault = new DefaultString("abcConstructor");
Console.WriteLine("Default string assigned to null: " + nullDefault);
Console.WriteLine("Default string constructed with null: " + nullConstructorDefault);
Console.WriteLine("Default string assigned empty string: " + emptyDefault);
Console.WriteLine("Default string constructed with empty string: " + emptyConstructorDefault);
Console.WriteLine("Default string assigned \"abc\": " + abcDefault);
Console.WriteLine("Default string constructed with \"abcConstructor\": " + abcConstructorDefault);
}
}
输出应为:
分配给null的默认字符串:不适用
使用null构造的默认字符串:不适用
默认字符串分配为空字符串:不适用
使用空字符串构造的默认字符串:不适用
指定的默认字符串abc:abc
使用abcConstructor构造的默认字符串:abcConstructor
另一个选项是创建自定义字符串类,该类隐式地从自定义类转换为字符串,从字符串转换为自定义类。这有点繁琐,但创建自定义属性类也是如此 我制作了一个.NET小提琴,展示了一个例子 下面是代码的副本,以防.NETFiddle消失
using System;
public class DefaultString
{
private const string _default = "N/A";
public DefaultString(string normal)
{
Value = normal;
}
private string _value = _default;
public string Value
{
get
{
return _value;
}
set
{
if (String.IsNullOrEmpty(value))
_value = _default;
else
_value = value;
}
}
public bool IsDefault()
{
return Value == _default;
}
public override string ToString()
{
return Value;
}
public static implicit operator string(DefaultString defaultString)
{
if (defaultString == null)
return _default;
return defaultString.ToString();
}
public static implicit operator DefaultString(string normal)
{
return new DefaultString(normal);
}
}
public class Program
{
public static void Main()
{
DefaultString nullDefault = null;
DefaultString nullConstructorDefault = new DefaultString(null);
DefaultString emptyDefault = String.Empty;
DefaultString emptyConstructorDefault = new DefaultString(String.Empty);
DefaultString abcDefault = "abc";
DefaultString abcConstructorDefault = new DefaultString("abcConstructor");
Console.WriteLine("Default string assigned to null: " + nullDefault);
Console.WriteLine("Default string constructed with null: " + nullConstructorDefault);
Console.WriteLine("Default string assigned empty string: " + emptyDefault);
Console.WriteLine("Default string constructed with empty string: " + emptyConstructorDefault);
Console.WriteLine("Default string assigned \"abc\": " + abcDefault);
Console.WriteLine("Default string constructed with \"abcConstructor\": " + abcConstructorDefault);
}
}
输出应为:
分配给null的默认字符串:不适用
使用null构造的默认字符串:不适用
默认字符串分配为空字符串:不适用
使用空字符串构造的默认字符串:不适用
指定的默认字符串abc:abc
使用abcConstructor构造的默认字符串:abcConstructor
问题不在于定义这样一个属性,而在于解释它。由于不存在这样的东西,如果属性有属性,你必须编写自己的逻辑来处理属性。属性通常是被动的。除非有明确的要求,否则它们无法在运行时运行任何代码。属性通常不会改变类的行为,而是添加元数据。类中通常有多少字符串字段?目前,您正在创建大量的工作—创建元数据和初始化代码,以保存3行=N/a;;我还想补充一点,这个解决方案解决了问题的错误端。UI应该用所需的EmptyDisplayString替换string.Empty…问题不在于定义这样的属性,而是解释它。由于不存在这样的东西,如果属性有属性,你必须编写自己的逻辑来处理属性。属性通常是被动的。除非有明确的要求,否则它们无法在运行时运行任何代码。属性通常不会改变类的行为,而是添加元数据。类中通常有多少字符串字段?目前,您正在创建大量的工作—创建元数据和初始化代码,以保存3行=N/a;;我还想补充一点,这个解决方案解决了问题的错误端。UI应使用所需的EmptyDisplayString替换string.Empty。。。