我有一个类,类中有n个变量,这些变量的类型我并不知晓,只能通过一个配置文件获取。
如第一个变量a的类型在配置文件中描述为double类型,则想定义为double类型,即double a。
第二个变量b的类型在配置文件中描述为int类型,则想定义为int类型,即int b。
以此类推。
请问大佬,我该怎么设计这个类,并通过配置文件定义类中变量?

解决方案 »

  1.   

    很奇怪的需求
    类的成员变量如果是从配置中定义的,不确定的。
    那也就说明了你这个类的职责是不明确的,你怎么使用这些不明类型的成员变量?

    如果只是为了操作数据,那么直接定义成json就可以了。
      

  2.   

    你可以用眼睛看配置文件,然后编写代码,然后编译为DLL,然后注册给——声明入——正在运行的某个程序。但是这中间要懂的所谓词法分析、语法分析、自动编码、编译调用、MEF 插件概念等等,其实都是软件专业最基本的概念。
      

  3.   

    想想看为啥Apache thrift,Google protocolbuffer,Hadoop avro,只支持那8种类型。为啥他们都是在设计期提前生成,不在运行期生成我们这里可以用emit生成,可以用鸭子类型玩。但是请告诉我在你写代码的时候他还不存在,你怎么写代码A.b+C.x到底报错还是不报错?
      

  4.   

    任何基于CLR的开发语言都是类型安全的,也就是定义的类型会在编译时进行安全检查,在编译之前就需要确定要值的类型,当然匿名类型(var)除外。变量是方法级别的,不同于属性或者字段的定义,它们是类级别的。无法在类级别使用var声明匿名变量,也最好不要全部声明为object类型,会发生装箱拆箱操作。你无法设计这个类
      

  5.   

    你就只能把这个类的属性都定义为object类型了。==========
    最新文章:解读经典《C#高级编程》 第四章之 泛型约束 https://mp.weixin.qq.com/s/ZHiaTpzBD-OdPs0Eo7iawQ
    欢迎关注微信公众号 “产品技术知与行” ,解读技术经典书籍(C#,Java,Js),发表技术专题、提供源码下载,打造全面结构化知识库,欢迎对全栈/跨语言技术有兴趣的小伙伴关注。 
      

  6.   

    试试看使用 表达式树呢。
    假设list是从xml读取的吧。
      

  7.   

    不在于生成一个对象,在于你在运行期怎么用。比如avro,json.net 都内置的了类似字典类的玩意,同样dataset,datatable也是一样,包括楼上的那种也是一样。所以不是生成了一个什么变量类型,如果你想在运行期使用,那么这个东西必须是类似字典的东西,因为只有这样你在编码期才是统一的东西。否则请问你想怎么编写代码?A.a+"fafsaf" 可以过?
    A.a+103 也可以过?那么他是什么?只能是“鸭子类型”-dynamic,只能你自己保证运算。
      

  8.   

    有关 EXpandoObject、DataTable、JObject 等等等等动态数据对象机制,都是确定的靠谱的,这不叫什么“我有一个类,类中有n个变量,这些变量的类型我并不知晓”,设计开发这些类型的工程师——以及有能力使用它们编程开发的工程师——是非常清楚这些类型有什么属性、属性的类型定义的!泛型并不是什么“不确定的类型参数”,泛型是一个模板语法糖,你要使用泛型你就必须将泛型参数具体化,起码要地你是给出了具体的类型才能用泛型。所以所谓的“这些变量的类型我不知晓”就好像你因为爱上了镜子中的那个头颅而发疯了、硬要把自己的脑袋割下来一样,纯粹是本末倒置。
      

  9.   

    https://www.cnblogs.com/zzqvq/p/5814400.html我觉得你可以参考一下这个
      

  10.   

    用JSON是比較好的方式
      

  11.   

    "用反射”你也要知道你用来承载结果的东西是一个已经写好的具体的 Class 所实例化的对象,或者就算是 DataTable、JObject、ExpandoObject(或者其它实现了 IDictionary<string,object> 接口的 class)等等,也是明确地知道了你用的这些个技术的 Class 的具体类型定义。而 lz 说的根本不是这个。他说的是“根本不用 class 定义,只要随便地在运行时去随意修改 Class 定义,也就是根本不尊重 Class 概念,来编程”。这就是根本不存在的概念。
      

  12.   

    从文件读取,看样子类型是以文本方式出现的,用笨办法string readedType = Type.GetType("System.String").ToString();
    if(readedType== "System.String")
    {
        string var1 = "string";
        Console.WriteLine(var1);}
    else if(...)
    {
        ...
    }
      

  13.   


    string readedType = Type.GetType(从文件读取的类型).ToString();
      

  14.   

    全部用字符串不就可以了吗?什么类型也都可以采用序列化的方式来表示啊。想想Json……
      

  15.   

    直接object好了