如何在该类的属性上调用类方法

时间:2012-08-06 14:33:54

标签: c# class-design

我试图弄清楚如何在该类的属性上调用类方法。这是我的两个班级:

public class MrBase
{
    public int? Id { get; set; }
    public String Description { get; set; }
    public int? DisplayOrder { get; set; }

    public String NullIfEmpty()
    {
        if (this.ToString().Trim().Equals(String.Empty))
            return null;
        return this.ToString().Trim();
    }
}

public class MrResult : MrBase
{
    public String Owner { get; set; }
    public String Status { get; set; }

    public MrResult() {}
}
MrResult继承了MrBase。

现在,我希望能够在这些类的任何属性上调用NullIfEmpty方法......就像这样:

MrResult r = new MrResult();
r.Description = "";
r.Description.NullIfEmpty();
r.Owner = "Eric";
r.Owner.NullIfEmpty();

感谢。

埃里克

2 个答案:

答案 0 :(得分:3)

如果您希望此代码特定于您的模型,那么您可以通过稍微修改NullIfEmpty方法将其构建到您的设置器中,例如

private String _owner;

public String Owner
{
    get { return _owner; }
    set { _owner = NullIfEmpty(value); } 
}

...
public String NullIfEmpty(string str) 
{
    return str == String.Empty ? null : str;
}

答案 1 :(得分:2)

您应该为string编写扩展方法:

public static class StringExtensions
{
    public static string NullIfEmpty(this string theString)
    {
        if (string.IsNullOrEmpty(theString))
        {
            return null;
        }

        return theString;
    }
}

用法:

string modifiedString = r.Description.NullIfEmpty();

如果您的主要目标是自动“修改”类的每个string属性,则可以使用反射来实现此目的。这是一个基本的例子:

private static void Main(string[] args)
{
    MrResult r = new MrResult
    {
        Owner = string.Empty,
        Description = string.Empty
    };

    foreach (var property in r.GetType().GetProperties())
    {
        if (property.PropertyType == typeof(string) && property.CanWrite)
        {
            string propertyValueAsString = (string)property.GetValue(r, null);
            property.SetValue(r, propertyValueAsString.NullIfEmpty(), null);
        }
    }

    Console.ReadKey();
}