• C#基础知识---动态为类型添加属性


    一、概述

    通常情况下,我们是事先在类型中定义好属性的,但有时候,我们需要动态为一个类型添加某些属性,这个时候,我们就需要使用DynamicObject类型了。

    二、Demo

    using System;
    using System.Collections.Generic;
    using System.Dynamic;
    
    namespace ConsoleDynamicModel
    {
        public class DynamicModel : DynamicObject
        {
            private string propertyName;
            public string PropertyName
            {
                get { return propertyName; }
                set { propertyName = value; }
            }
    
            // The inner dictionary.
            Dictionary<string, object> dicProperty
                = new Dictionary<string, object>();
            public Dictionary<string, object> DicProperty
            {
                get
                {
                    return dicProperty;
                }
            }
    
    
            // This property returns the number of elements
            // in the inner dictionary.
            public int Count
            {
                get
                {
                    return dicProperty.Count;
                }
            }
    
            // If you try to get a value of a property 
            // not defined in the class, this method is called.
            public override bool TryGetMember(
                GetMemberBinder binder, out object result)
            {
                // Converting the property name to lowercase
                // so that property names become case-insensitive.
                string name = binder.Name;
    
                // If the property name is found in a dictionary,
                // set the result parameter to the property value and return true.
                // Otherwise, return false.
                return dicProperty.TryGetValue(name, out result);
            }
    
            // If you try to set a value of a property that is
            // not defined in the class, this method is called.
            public override bool TrySetMember(
                SetMemberBinder binder, object value)
            {
                // Converting the property name to lowercase
                // so that property names become case-insensitive.
                if (binder.Name == "Property")
                {
                    dicProperty[PropertyName] = value;
                }
                else
                {
                    dicProperty[binder.Name] = value;
                }
    
    
                // You can always add a value to a dictionary,
                // so this method always returns true.
                return true;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("动态为类型添加属性");
                dynamic dynamicModel = new DynamicModel();
                List<string> myList = new List<string>();
                myList.Add("Name");
                myList.Add("Age");
                myList.Add("Hobby");
    
                List<string> myValueList = new List<string>();
                myValueList.Add("Mary");
                myValueList.Add("18");
                myValueList.Add("Dance");
    
                for (int i = 0; i < myList.Count; i++)
                {
                    string myAttr = myList[i];
                    dynamicModel.PropertyName = myAttr;
                    dynamicModel.Property = myValueList[i];
                }
    
                Console.WriteLine($"Name: {dynamicModel.Name}");
                Console.WriteLine($"Age: {dynamicModel.Age}");
                Console.WriteLine($"Hobby: {dynamicModel.Hobby}");
            }
        }
    }
  • 相关阅读:
    Oracle的 listagg() WITHIN GROUP ()函数使用
    AJAX工作原理与缺点
    牛客网数据库SQL实战(此处只有答案,没有表内容)
    Jsp的四大作用域与九大对象
    eclipse的debug调试技巧
    浏览器与服务器交互
    eclipse图标含义
    不要在构造和析构函数中调用虚函数
    构造,析构 cpp
    2 c++对象被使用前要先被初始化
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9921418.html
Copyright © 2020-2023  润新知