有没有更好的方法在自定义类的属性中执行类型检查?
例如:
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();
来自社区的任何智慧言论?
答案 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(); }
}
(当然,包括适当的相关错误检查,为了简洁起见,在本例中省略了。)
基本上,您将类型的转换与实际模型属性分开,创建一种仅用于转换类型的传递操作。