有没有更容易/更好的方法来做到这一点,因为C#中不允许向下转换?"

Har*_*can 1 .net c# downcast

可能是一个争论性话题,但是......我真的很讨厌我不能做到以下几点:

class User 
{
   public string ImageURL {get;set;}
}

class UserUI : User 
{
   public Brush ImageBrush {get;set;}
}

User user = GetFromUserFromServer(); //returns User type object, not UserUI
UserUI userUI = user;
userUI.ImageBrush = CreateBrush(userUI.ImageURL);
Run Code Online (Sandbox Code Playgroud)

相反,我使用以下内容:

class User 
{
   public virtual string ImageURL {get;set;}
}

class UserUI : User 
{
   public override string ImageURL 
    {
        get
        {
            return base.ImageURL ;
        }
        set
        {
            if (value != base.ImageURL )
            {                    
                base.ImageURL = value;
                ImageBrush = CreateBrush(value);
            }
        }
    }

   public Brush ImageBrush {get;set;}

   public UserUI(User user)
   {
       ImageURL = user.ImageURL;
   }
}

User user = GetFromServer();
UserUI userUI = new UserUI(user);
Run Code Online (Sandbox Code Playgroud)

它更详细,每当我向User添加字段时,我需要确保在UserUI构造函数中复制它们.

是否可以公平地说,允许向下转换会使所有这些变得更容易,更不容易出错?

aqu*_*nas 5

嗯...没有.你认为这样做会发生什么,毕竟,这和你的例子一样有效:

string whatever = "";
UserUI userUI = whatever;
userUI.ImageBrush = CreateBrush(userUI.ImageURL);
Run Code Online (Sandbox Code Playgroud)

毕竟,两者都从对象继承.userUI.ImageURL会抛出异常,因为该属性不存在吗?或者是什么?这很疯狂.:)

编辑:您在上面的评论中说:

"是的.我的论点是应该有一种方法可以转换为派生类型,框架会自动复制两种类型中存在的字段,并将其他类型留空.在这种情况下,ImageURL将被复制.

如果是你想要的,那么使用Automapper:https://github.com/AutoMapper/AutoMapper/wiki