c#custom class在属性方法中执行类型检查

时间:2016-08-31 15:43:21

标签: c#

有没有更好的方法在自定义类的属性中执行类型检查?

例如:

namespace DataTransferObjects
{
    public class sampleDTO
    {
        private string _fname;
        private string _lname;

        public string FirstName
        {
            get;
            set {_fname = value == null ? String.Empty : value.ToString(); }
        } 

        public string LastName
        {
            get;
            set { _lname = value == null ? String.Empty : value.ToString(); }
        }

    } // class
} // namespace
.
.
.
sampleDTO sDTO = new sampleDTO();
sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value;
sDTO.LastName = DataGridViewSample.Rows[0].Cells["LastName"].Value;

问题是编译器不允许将对象传递给类。

我可以按如下方式重写:

namespace DataTransferObjects
{
    public class sampleDTO
    {
        private string _fname;
        private string _lname;

        public object FirstName
        {
            get { return (object)_fname; }
            set {_fname = value == null ? String.Empty : value.ToString(); }
        } 

        public object LastName
        {
            get { return (object)_lname; }
            set { _lname = value == null ? String.Empty : value.ToString(); }
        }

    } // class
} // namespace

但这看起来太笨重了,因为我现在必须按照以下方式投出任何电话

string tempFirstName = sDTO.FirstName.ToString();

来自社区的任何智慧言论?

2 个答案:

答案 0 :(得分:2)

正确的做法是使用类似第一个示例的内容,但在设置属性之前将值转换为string

sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value as string;

你的例子确实需要修改一下,但是:

    public string FirstName
    {
        get {return _fname;}
        set {_fname = value ?? String.Empty; }
    } 

答案 1 :(得分:1)

  

有没有更好的方法在自定义类的属性中执行类型检查?

您的意思是 null check 吗?因为那是属性中的代码所做的事情。您可以将每个setter缩短为:

_fname = value ?? string.Empty;

null coalescing operator基本上完成了条件运算符在这种情况下所做的事情。如果第一个值不为null,则返回第一个值;如果不是,则返回第二个值。而且您不需要.ToString(),因为该值已经是一个字符串。

但"类型检查"默认情况下已经完成,只能将一个字符串传递给该属性。

  

问题是编译器不允许将对象传递给类。

嗯,不。 C#是静态类型的。所以你必须传递一个字符串。这可能很简单:

sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value.ToString();

或者也许:

sDTO.FirstName = (string)DataGridViewSample.Rows[0].Cells["FirstName"].Value;
  

我可以按如下方式重写:[...]

您绝对不想让属性属于object类型,因为只要您读取属性,您就必须进行转换/转换/等等模型本身将不再封装它实际代表的内容,并且所有使用代码来完成它的工作。

可以做的是为此目的添加其他属性/方法?考虑一种方法,例如:

public void SetFirstNameFromObject(object firstName)
{
    this.FirstName = firstName.ToString();
}

或者如果你想把它放在一个属性中:

public object FirstNameAsObject
{
    get { return this.FirstName; }
    set { this.FirstName = value.ToString(); }
}

(当然,包括适当的相关错误检查,为了简洁起见,在本例中省略了。)

基本上,您将类型的转换与实际模型属性分开,创建一种仅用于转换类型的传递操作。