将属性附加到对象

时间:2014-12-10 15:51:14

标签: c#

我有一个User类(也有几个子类)在大型系统中使用。在非常特殊的情况下,我需要在课堂上附加一些额外的属性。但是,出于几个原因,我其他时候并不想要它们。

创建子类似乎不可能,因为我无法将我的对象向下转换为此派生类型。我也不能使用复制构造函数来构造这些子类型对象,因为我不知道我的对象是否继承了某些子类的属性。

我需要的简化示例:

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

属性如:

public string FirstLetterOfFirstName { get { return Firstname.Substring(0, 1); } }

您如何为User类型的对象提供此类属性?

我尝试了深度克隆,但我仍然只得到一个User对象,我仍然无法使用该属性强制转换为我的类型。这有可能以任何方式吗?

我不想使用方法(包括扩展方法),因为我在别处使用这些属性从对象中提取相关数据。

3 个答案:

答案 0 :(得分:3)

在这种情况下,它可能是一种扩展方法:

public static class UserExtensionMethods
{
    public static string FirstLetterOfFirstName(this User user)
    {
        return user.FirstName.Substring(0, 1);
    }
}

然后叫它:

user.FirstLetterOfFirstName();

其他选项包括ExpandoObject,您可以在其中动态添加ActionFunc

样本:

dynamic x = new ExpandoObject();
x.User = new User();
x.FirstLetterOfFirstName = new Func<string>(() => x.User.FirstName.Substring(0, 1));

如你所见,它并没有变得更清晰。使用扩展方法。这是更好的方式。

答案 1 :(得分:1)

您可以对这种行为使用扩展方法,但它们不能作为属性访问,而是作为方法访问:

public static class UserExtensions
{
    public static string FirstLetterOfFirstName(this User user) 
    {
        return user.FirstName.Substring(0,1);
    }
}

// In your code

User u = new User();
u.FirstLetterOfFirstName();

作为旁注,扩展方法只能访问扩展类/结构的公共成员和内部成员(如果它们在同一个程序集中)。

答案 2 :(得分:0)

扩展方法是可行的方法。这些可以是您需要它的组件的内部,而不是外部世界。

您还可以明确实现内部接口,这样您就只能在程序集中使用此接口的功能