zoukankan      html  css  js  c++  java
  • 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}");
            }
        }
    }
  • 相关阅读:
    Windows2012 cannot access netapp CIFS share
    Import SHA2 SSL cert to Windows IIS7
    IE11登陆交行网银崩溃
    Understanding and Managing SMTP Virtual Servers
    IIS SMTP Queue stuck
    C#夯实基础之多线程三:线程的优先级
    C#夯实基础之多线程二:主线程、前台线程与后台线程
    ORA-00257: archiver error. Connect internal only, until freed.
    C#夯实基础之多线程一:初识多线程
    在Oracle中恢复被DROP掉的表
  • 原文地址:https://www.cnblogs.com/3xiaolonglong/p/9921418.html
Copyright © 2011-2022 走看看