Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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属性_C#_.net - Fatal编程技术网

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。。。