我有一个User
类(也有几个子类)在大型系统中使用。在非常特殊的情况下,我需要在课堂上附加一些额外的属性。但是,出于几个原因,我其他时候并不想要它们。
创建子类似乎不可能,因为我无法将我的对象向下转换为此派生类型。我也不能使用复制构造函数来构造这些子类型对象,因为我不知道我的对象是否继承了某些子类的属性。
我需要的简化示例:
class User
{
public string Firstname { get; set; }
}
属性如:
public string FirstLetterOfFirstName { get { return Firstname.Substring(0, 1); } }
您如何为User
类型的对象提供此类属性?
我尝试了深度克隆,但我仍然只得到一个User对象,我仍然无法使用该属性强制转换为我的类型。这有可能以任何方式吗?
我不想使用方法(包括扩展方法),因为我在别处使用这些属性从对象中提取相关数据。
答案 0 :(得分:3)
在这种情况下,它可能是一种扩展方法:
public static class UserExtensionMethods
{
public static string FirstLetterOfFirstName(this User user)
{
return user.FirstName.Substring(0, 1);
}
}
然后叫它:
user.FirstLetterOfFirstName();
其他选项包括ExpandoObject
,您可以在其中动态添加Action
和Func
。
样本:
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)
扩展方法是可行的方法。这些可以是您需要它的组件的内部,而不是外部世界。
您还可以明确实现内部接口,这样您就只能在程序集中使用此接口的功能