动态创建对象的实现

public enum UpdateModelType : int
    {
        [RequestAttribute("eval_model_stat.json", typeof(ModelStatRequest))]
        MODEL_STAT = 0,
        /// <summary>
        /// 财务历史 eval_fin_rpt_hyr.json
        /// </summary>
        [RequestAttribute("eval_fin_rpt_hyr.json", typeof(FinRptHyrRequest))]
        FIN_RPT_HYR = 1,

        /// <summary>
        /// 资产负债表 eval_fin_bs.json
        /// </summary>
        [RequestAttribute("eval_fin_bs.json", typeof(FinBsRequest))]
        FIN_BS = 2,

        /// <summary>
        /// 融资预测 eval_fin_fund.json
        /// </summary>
        [RequestAttribute("eval_fin_fund.json", typeof(FinFundRequest))]
        FIN_FUND = 3,

        /// <summary>
        /// 财务分析 eval_fin_analysis.json
        /// </summary>
        [RequestAttribute("eval_fin_analysis.json", typeof(FinAnalysisRequest))]
        FIN_ANALYSIS = 4,

        /// <summary>
        /// 杜邦分析 eval_fin_dupont.json
        /// </summary>
        [RequestAttribute("eval_fin_dupont.json", typeof(FinDupontRequest))]
        FIN_DUPONT = 5,

        /// <summary>
        /// 绝对估值 eval_fin_absolute.json
        /// </summary>
        [RequestAttribute("eval_fin_absolute.json", typeof(FinAbsoluteRequest))]
        FIN_ABSOLUTE = 6
    }
public class RequestAttribute:Attribute
    {
        public string Config { get; set; }
        public Type RequestBodyType { get; set; }
        public RequestAttribute(string config,Type requestBodyType)
        {
            this.Config = config;
            this.RequestBodyType = requestBodyType;
        }
    }

Config表示取值规则,RequestBodyType要创建的数据类型

private RequestAttribute GetRequestAttrubute(UpdateModelType type)
        {
            RequestAttribute result = null;
            FieldInfo fieldInfo = type.GetType().GetField(type.ToString());
            RequestAttribute[] requestAttributes = (RequestAttribute[])fieldInfo.GetCustomAttributes(typeof(RequestAttribute), false);
            if (requestAttributes != null && requestAttributes.Length > 0)
            {
                result = requestAttributes[0];
            }
            return result;
        }
private Dictionary<string, PropertyInfo> GetProperties(Type t)
        {
            if (cacheProperties.ContainsKey(t.FullName))
            {
                return cacheProperties[t.FullName];
            }

            Dictionary<string, PropertyInfo> dicResult = new Dictionary<string, PropertyInfo>();

            var properties = t.GetProperties();
            foreach (var pro in properties)
            {
                // 优先从JsonPropertyAttribute取得别名
                var customAttrubutes = pro.GetCustomAttributes(typeof(JsonPropertyAttribute), false);
                string key = string.Empty;
                if (customAttrubutes.Length > 0)
                {
                    key = (customAttrubutes[0] as JsonPropertyAttribute).PropertyName;
                }
                else
                {
                    key = pro.Name;
                }
                dicResult.Add(key, pro);

                // 如果是复合类型,则递归取得子属性
                if (pro.PropertyType != typeof(string) && pro.PropertyType.BaseType != typeof(ValueType))
                {
                    var subDic = GetProperties(pro.PropertyType);
                    foreach (var subKey in subDic.Keys)
                    {
                        dicResult.Add(key + "." + subKey, subDic[subKey]);
                    }
                }
            }

            if (dicResult.Count > 0)
            {
                cacheProperties.Add(t.FullName, dicResult);
            }
            return dicResult;
        }
GetProperties方法:讲属性取出,例如:class A{  public int No{get;set;}   public B B{get;set;}}class B{    public int b{get;set;}    public string name{get;set;}}

取出结果为:  No  B.b  B.name

待续....
 

 
 
RequestAttribute的json表示配置文件位置,
 
时间: 2024-10-27 06:06:15

动态创建对象的实现的相关文章

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数、抽象类、虚析构函数、动态创建对象

C++ Primer 学习笔记_34_面向对象编程(5)--虚函数与多态(二):纯虚函数.抽象类.虚析构函数.动态创建对象 一.纯虚函数 1.虚函数是实现多态性的前提 需要在基类中定义共同的接口 接口要定义为虚函数 2.如果基类的接口没办法实现怎么办? 如形状类Shape 解决方法 将这些接口定义为纯虚函数 3.在基类中不能给出有意义的虚函数定义,这时可以把它声明成纯虚函数,把它的定义留给派生类来做 4.定义纯虚函数: class <类名> { virtual <类型> <函

反射之动态创建对象

前言 C#有关反射的话题已经是个老生常谈的话题,也许园友一看这标题都不屑去看了,但是既然拿出来讲必有讲之道理,当然,不喜勿喷,高手请绕道!直入话题. 讨论 定义一个Person类代码如下 1 public class Person 2 { 3 4 /// <summary> 5 /// 年龄 6 /// </summary> 7 public int Age { get; set; } 8 9 /// <summary> 10 /// 姓名 11 /// </su

.Net——动态创建对象

刚开始看到这个标题的时候其实我也是很难接受的,duang~因为实在想不出什么时候我要去这样子创建对象,干嘛不new一个呢?但根据学习设计模式的经验来说,有时候,不去new对象才是最灵活的做法. 首先,写个小类拿着玩儿: public class Calculator { private int x; private int y; public Calculator() { x = 0; y = 0; Console.WriteLine("Calculator () invoked");

动态创建对象

C#主要支持 5 种动态创建对象的方式: 1. Type.InvokeMember 2. ContructorInfo.Invoke 3. Activator.CreateInstance(Type) 4. Activator.CreateInstance(assemblyName, typeName) 5. Assembly.CreateInstance(typeName) 最快的是方式 3 ,与 Direct Create 的差异在一个数量级之内,约慢 7 倍的水平.其他方式,至少在 40

【C#反射-动态创建对象】

上面博客学习了使用反射查看类型的信息,以及使用反射获取特性对象. 下面使用反射来动态创建对象.首先准备一个Test类: public class TestClass { public TestClass() { Console.WriteLine("这是一个无参构造函数"); } public TestClass(int a, int b) { Console.WriteLine("这是一个有参数构造函数 > a+b=" + (a + b)); } publi

通过反射动态创建对象、方法

之前做的都是获取特性对象,都是查元数据的信息,现在我们可以通过反射开始动态的去创建对象和方法 1.两种调用无参构造函数的方法: 创建一个DemoClass,里面有无参构造函数和有参构造函数 public class DemoClass { public string Name { get; set; } public int Age { get; set; } public DemoClass() { Console.WriteLine("无参构造函数被调用啦"); } public

C++语言动态创建对象

焦头烂额的考试月终于过去了,终于有时间能停下来思考记录一下这一个月学过的东西,首先先总结一下,在自己仿写魂斗罗游戏时遇见的问题之一,人物在移动的时候如何去判断什么时候掉入水中显示水中画面,什么时候敌人该开枪,这个时候我使用了一堆数字来描述地图,如图 但是在代码实现时,就得用一大堆判断,来判断何时应该创建对象来调用成员函数,其代码繁杂不说,更加降低了代码的复用性,如果我想在其中添加功能,还得再修改代码,这个时候我就想到了动态创建数组这个东西,根据我输入的数字长度,数组可以自动去增长,那对象是不是可

javascript动态创建对象

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head> <title></title> <scr

于Unity3D动态创建对象和创建Prefab三种方式的原型对象

u3d在动态创建的对象,需要使用prefab 和创建时 MonoBehaviour.Instantiate( GameObject orignal) 需要的对象为原型. 文提供三种方式获得prefab对象. 方式一:使用脚本的public字段 直接在Project视图里找到做好的prefab,将其拖拽到指定脚本的指定public GameObject 字段. 方式二:Resource类 1.在Assets目录下的任何位置创建一个名为resources的目录.将做好的prefab放到这个目录下,p

JAVA基础篇—接口实现动态创建对象

Scanner在控制台输入内容 package com.Fruit; public interface Fruit {//提供接口 } package com.Fruit; public class Apple implements Fruit{ public Apple(){ System.out.println("创建了一个苹果"); }} public class Oranges implements Fruit{ public Oranges(){ System.out.pri