C# 在C语言中如何在不继承的情况下向类添加附加属性#
我正在上一门课C# 在C语言中如何在不继承的情况下向类添加附加属性#,c#,inheritance,C#,Inheritance,我正在上一门课MobileInfo public class MobileInfo { public string MobileName { get; set; } public string MobileOS { get; set; } } 我需要再添加一个属性 public string MobileModel { get; set; } 在我的主项目中,我在100多个类文件中实现了Model类,而基本类MobileInfo位于远程服务器中。我需要在不继承和不修改基类的情
MobileInfo
public class MobileInfo
{
public string MobileName { get; set; }
public string MobileOS { get; set; }
}
我需要再添加一个属性
public string MobileModel { get; set; }
在我的主项目中,我在100多个类文件中实现了Model
类,而基本类MobileInfo
位于远程服务器中。我需要在不继承和不修改基类的情况下添加属性
注意:不要创建派生类来添加此属性,因为
无法更改基类实例。我得到允许去
访问该实例,我可以添加属性,而无需触摸
基类
若不更改类的属性代码,则无法为该类添加属性 使用
System.Reflection.Emit
方法,您可以创建动态程序集,它将复制您的MobileInfo
和整个子类层次结构。见和。之后,您可以将所需属性添加到生成的MobileInfo
副本中。接下来,您应该配置抽象工厂,当您查询类型时,它将返回生成的类型
但这相当困难。我强烈建议重新构建您的项目架构。由于
MobileInfo
位于远程服务器上,因此您的本地数据模型应具有MobileInfo
的副本,并且不应继承远程MobileInfo
,此外,您还应具有从远程服务器数据模型对象映射到本地的方法。因此,您可以使用本地的MobileInfo
执行任何您想要的操作。如果不更改类的属性,则无法为该类添加属性
使用System.Reflection.Emit
方法,您可以创建动态程序集,它将复制您的MobileInfo
和整个子类层次结构。见和。之后,您可以将所需属性添加到生成的MobileInfo
副本中。接下来,您应该配置抽象工厂,当您查询类型时,它将返回生成的类型
但这相当困难。我强烈建议重新构建您的项目架构。由于
MobileInfo
位于远程服务器上,因此您的本地数据模型应具有MobileInfo
的副本,并且不应继承远程MobileInfo
,此外,您还应具有从远程服务器数据模型对象映射到本地的方法。因此,您可以使用本地的MobileInfo
做任何您想做的事情。
“我在100多个类文件中实现了模型类”是什么意思?您是否有100多个MobileInfo的后代?假设您已经添加了所需的属性。您计划如何设置其值?为什么不允许您交互该类?由于
MobileInfo
位于远程服务器上,我假设您有该类的本地实现,该类映射到MobileInfo
,并且您的100多个子类继承自本地基类。为什么不能将属性添加到本地基类?您希望在不更改其代码的情况下更改该类,对吗?我认为这是不可能的,也没有什么意义。你到底想实现什么?@slawekwin-很可能你是对的……你说的“我在100多个类文件中实现了模型类”是什么意思?您是否有100多个MobileInfo的后代?假设您已经添加了所需的属性。您计划如何设置其值?为什么不允许您交互该类?由于MobileInfo
位于远程服务器上,我假设您有该类的本地实现,该类映射到MobileInfo
,并且您的100多个子类继承自本地基类。为什么不能将属性添加到本地基类?您希望在不更改其代码的情况下更改该类,对吗?我认为这是不可能的,也没有什么意义。你到底想实现什么?@slawekwin-很可能你是对的。。。
var curPhone = new MobileInfo();
curPhone.MobileName = "iphone";
curPhone.MobileOS = "ios";
TypeDescriptor.AddAttributes(typeof(MobileInfo), new simpleAttribute());
AttributeCollection collection = TypeDescriptor.GetAttributes(curPhone);
simpleAttribute attr = ((simpleAttribute)collection[typeof(simpleAttribute)]);
if (attr != null)
{
attr.MobileModul = "s6";
//MessageBox.Show(attr.MobileModul);
}
}
public class simpleAttribute : Attribute
{
public string MobileModul { get; set; }
}