【问题标题】:C# Extend a class dynamically to include more fields during executionC#动态扩展一个类以在执行期间包含更多字段
【发布时间】:2016-06-06 01:20:07
【问题描述】:

我有课

 Class account {
    Int id ;
 }

我想在运行时将其更改为

 Class account {
     Int id;
     String Name;
 }

我想制作一个新修改的类的对象

这可能吗,真的很有帮助

【问题讨论】:

标签: c# oop


【解决方案1】:

我并不是说这是不可能的,但我认为不是。相反,您可以像这样使用实体组合

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            Account a = new Account();
            a.Add("My name is John");
            a.Add(10);

            Console.WriteLine(a.Get<int>(typeof(int)));
            Console.WriteLine(a.Get<string>(typeof(string)));
            Console.ReadLine();
        }
    }

    class Account
    {
        private Dictionary<Type, object> _fields = new Dictionary<Type, object>();

        public void Add(object data)
        {
            _fields.Add(data.GetType(), data);
        }

        public void Remove(Type type)
        {
            _fields.Remove(type);
        }

        public T Get<T>(Type type)
        {
            object data = null;
            if (_fields.TryGetValue(type, out data))
            {
                return (T)data;
            }

            return default(T);
        }
    }
}

您可以添加任何类并再次检索它。我建议即使对于最简单的字段也使用包装类,否则您可能会阻止自己添加更多字符串类型的字段。例如,您不能同时添加姓名和姓氏,您必须将它们包装在 Name and Surname 类中。 现在,如果您想在运行时执行此操作,您还必须考虑使用组件框架,例如 MEF

【讨论】:

  • 哇,好像真的有可能
  • 我们已经使用上面的这种方法来使用 Netbeans 平台在 Java 中开发基于组件的游戏。所以是的,这确实是可能的。尽管您应该知道,像这样的模式确实会增加一些开销。
【解决方案2】:

好像是not possible。但是,您可以使用不同的方法:

 var account = new Dictionary<string, object>();
 account["id"] = 42;
 account["name"] = "my name";

这可能比尝试添加另一个字段对性能更友好。

编辑

按照@LuqJensen 的回答,如果添加两个字符串,谁会有问题,你也可以这样做:

class Account
{
    private Dictionary<string, object> _fields = new Dictionary<Type, object>();

    public void Set(string name, object data)
    {
        _fields[name] = data;
    }

    public T Get<T>(string name)
    {
        object data = null;
        if (_fields.TryGetValue(type, out data))
            return (T)data;

        return default(T);
    }
}

【讨论】:

  • 哇,错过了那个动态的东西......谢谢
  • 抱歉@ArunprasadesEdathadan 我无法测试它。它不起作用,但我已经更新了我的答案
  • 不仅看起来,而且不可能的。以上只是不起作用(你得到运行时异常)。
  • 一定有办法做到这一点
  • 访问前必须添加键/值。
【解决方案3】:

如果你真的需要这样做,我总是不建议这样做,你可以像这样使用System.Dynamic命名空间:

dynamic obj = new System.Dynamic.ExpandoObject();
obj.id = 100;
obj.Name = "Something";

当然请记住,编译器代表您为保持代码正常运行所做的一切,现在都必须在运行时完成。

【讨论】:

  • 但是我想动态添加一些额外的字段到已经写好的类
  • 在这种情况下引用 Skeet 先生的话:“你不能只是在执行时动态地改变一个类。如果你愿意,你可以派生一个新的类……”
  • 你能给出一个示例或链接到这个,动态派生
猜你喜欢
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多