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; }

    }