如何组合来自不同类的属性

本文关键字:同类 属性 何组合 组合 | 更新日期: 2023-09-27 18:34:03

假设我有两个类,比如

public partial class dbUserDetails
{
    public int Id { get; set; }
    [AllowHtml]
    public string Bio { get; set; }
    //some properties
}
public partial class SomeOtherClass
{
    [DisplayName("Profile Picture (max. 2MB)")]
    public HttpPostedFileBase File { get; set; }
    //some properties
}

我想结合一些属性,例如

public class Settings
{
    //HttpPostedFileBase File
    //public string Bio { get; set; }
}

剃刀:

@model myAppp.Models.Settings
@Html.EditorFor(m => m.Bio)
@Html.EditorFor(m => m.File)

可以这样使用吗?我对interfacepartial有所了解.但我不知道我到底会怎么弄清楚。

如何组合来自不同类的属性

为此,您必须将信息从dbUserDetailsSomeOtherClass传递给您的设置类。最简单的方法是简单地使用其他两个类的实例创建 Settings 类,并使它们作为属性可用:

public class Settings{
    private dbUserDetails userDetails;
    public dbUserDetails UserDetails {
        return userDetails;
    }
    private SomeOtherClass someOtherInfo;
    public SomeOtherClass SomeOtherInfo{
        return someOtherInfo;
    }
    public Settings(dbUserDetails user, SomeOtherInfo other)    {
        userDetails = user;
        someOtherInfo = other;
    }
}

现在您可以通过以下方式访问它们:m => m.UserDetails.Bio

我是通过这种访问方式而不是您之前提到的(直接访问(的方式来做到的,否则您将在两个位置复制该属性。只有在有充分理由的情况下,我才会这样做。

编辑:

有关我为什么选择上述编写代码的一些说明:此时,将dbUserDetailsSomeOtherClass对象存储在Settings中不会产生大量内存开销。它们的所有属性都应该可以使用Settings访问,因为它们必须存储在某个地方。因此,我决定把它们留在原地。仅当两个类存储的信息多于您希望访问的信息并且不再使用以便可以删除它们时,才会发生内存问题。在这种情况下,像这样实际复制信息是有意义的:

public class Settings{
    private string bio;
    public string Bio {
        return bio;
    }
    /*...*/
    public Settings(dbUserDetails user, SomeOtherInfo other)
    {
        bio = user.Bio;
        /*...*/
    }
}

如果在执行此操作时不删除上述两个对象,则会存储两次信息(=>内存开销(。这比仅仅存储对对象的引用更糟糕。

另一种选择是:

public class Settings{
    private dbUserDetails userDetails;
    public string Bio {
        return userDetails.Bio;
    }
    public Settings(dbUserDetails user, SomeOtherInfo other)
    {
        userDetails = user;
        /*...*/
    }
}

这将与第一个想法相同,但可以直接访问属性。它也可以工作,但会导致更多的代码重复。子对象中的每个新属性都会导致一个属性Settings