c#自定义类在properties方法内部执行类型检查

c#自定义类在properties方法内部执行类型检查,c#,C#,是否有更好的方法在自定义类的属性内部执行类型检查 例如: namespace DataTransferObjects { public class sampleDTO { private string _fname; private string _lname; public string FirstName { get; set {_fname = value ==

是否有更好的方法在自定义类的属性内部执行类型检查

例如:

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();
社区里有什么智慧的话吗

是否有更好的方法在自定义类的属性内部执行类型检查

你是说空检查吗?因为这就是属性中的代码所做的。您可以将每个setter缩短为:

_fname = value ?? string.Empty;
在本例中,基本上执行条件运算符所做的操作。如果第一个值不为null,则返回第一个值;如果为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(); }
}
sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value as string;
(当然,适当地包括相关的错误检查,为了简洁起见,本例不包括在内。)

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

是否有更好的方法在自定义类的属性内部执行类型检查

你是说空检查吗?因为这就是属性中的代码所做的。您可以将每个setter缩短为:

_fname = value ?? string.Empty;
在本例中,基本上执行条件运算符所做的操作。如果第一个值不是空,则返回第一个值,如果不是空,则返回第二个值。您不需要
.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(); }
}
sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value as string;
(当然,适当地包括相关的错误检查,为了简洁起见,本例不包括在内。)


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

正确的做法是使用与第一个示例类似的方法,但在设置属性之前将值转换为
字符串:

public object FirstNameAsObject
{
    get { return this.FirstName; }
    set { this.FirstName = value.ToString(); }
}
sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value as string;
不过,您的示例确实需要稍加修改:

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

正确的做法是使用与第一个示例类似的方法,但在设置属性之前,将值强制转换为
字符串

public object FirstNameAsObject
{
    get { return this.FirstName; }
    set { this.FirstName = value.ToString(); }
}
sDTO.FirstName = DataGridViewSample.Rows[0].Cells["FirstName"].Value as string;
不过,您的示例确实需要稍加修改:

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

sDTO.FirstName=(字符串)DataGridViewSample.Rows[0]。单元格[“FirstName”]。值;如果该值为空,则生成运行时错误。@rayllback:不,它不是
(string)null
很好用。@rayllback:Ah,但如果你的意思是它是
DbNull
,那就有意义了。怎么样
sDTO.FirstName=DataGridViewSample.Rows[0]。单元格[“FirstName”]。值为字符串?sDTO.FirstName=(字符串)DataGridViewSample.Rows[0]。单元格[“FirstName]”。值;如果该值为空,则生成运行时错误。@rayllback:不,它不是
(string)null
很好用。@rayllback:Ah,但如果你的意思是它是
DbNull
,那就有意义了。怎么样
sDTO.FirstName=DataGridViewSample.Rows[0]。单元格[“FirstName”]。值为字符串?也许我说得不够清楚。如果我这样做:也许我没有说清楚。如果我这样做:string TempStr=DGV.Rows[0]。单元格[“Name”].ToString(),或者如果我这样做:string TempStr=(string)DGV.Rows[0]。单元格[“Name”].Value;and.Value为空,则我得到一个错误。@rayllback:您只是在寻找
DBNull
对象吗?您可以将
.Value
与之进行比较,以查看它是否表示数据库中的
null
值。这有点像ADO.NET特定版本的检查
null
。因此,
==DBNull.Value
将像任何
==null
一样使用。该死,我试图将数据值从数据网格视图移动到DTO的工作抽象出来。我的希望是使其与UI逻辑无缝连接(为什么我的UI会关心存储的细节)?因此,最简单的方法是这样的语句:string TempStr=DGV.Rows[0]。Cells[“Name”]。Value==null:?String.Empty:DGV.Rows[0]。单元格[“Name”].Value.ToString();基本上,在调用.ToString()方法之前,我们必须测试null条件。我感谢您的帮助!!也许我说得不够清楚。