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

时间:2016-02-10 23:43:45

标签: c# class razor

我们说我有两个类,比如

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有所了解。但我不知道我将如何弄明白。

1 个答案:

答案 0 :(得分:1)

要实现此目的,您必须将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

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

修改

为了澄清我选择上述代码的原因: 在dbUserDetails中存储SomeOtherClassSettings对象不会在此时产生大量内存开销。所有属性都应该可以使用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

中的属性