通过反射从动态对象中获取属性

问题描述

首先:现代框架通过属性名称访问值是什么意思?!你疯了吗?

无论如何:我有点坚持使用反射在普通“对象”上运行的框架,同时提供来自用户的“PropertyName”。为了消除这种疯狂,我的第一次尝试是使用 ExpandoObject。这不起作用,因为框架可能使用 Getproperty() 访问对象。我不得不做一些丑陋的 AnonymousObject 事情来解决它。 (见下面的代码

我的问题有两个方面:我想要一个动态对象,它可以“欺骗”反射库返回一个“真”和一个值,或者一种实现这样一个不那么明确的 AnonymousObject 的方法(对于 n 个项目)

代码

using morelinq.Extensions;
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;

namespace ConsoleApp1
{


    class Program
    {
        private static ExpandoObject asExpando(IEnumerable<object> args)
        {
            var result = new ExpandoObject();
            int itemIndex = 0; args.ForEach(arg => result.TryAdd($"Item{itemIndex++}",arg));
            return result;
        }

        static void Main(string[] args)
        {
            List<object> myList = new List<object>() { "Hello World",true };

            object expando = asExpando(myList);
            object anonymous = AnonymousObject.Create(myList);

            dynamic first = expando;
            dynamic second = anonymous;
            Console.WriteLine($"Accessing item dynamically: {first.Item0},{first.Item1}");
            Console.WriteLine($"Accessing item by Property: {second.Item0},{second.Item1}");

            bool expandoReflexion = expando.GetType().GetProperty("Item0") != null;
            bool anonymousReflexion = anonymous.GetType().GetProperty("Item0") != null;

            Console.WriteLine($"dynamically: {expandoReflexion}; by Property: {anonymousReflexion}");

            /*
             Output: 

                Accessing item dynamically: Hello World,True
                Accessing item by Property: Hello World,True
                dynamically: False; by Property: True
             */
        }
    }


    public class AnonymousObject
    {
        protected AnonymousObject(IEnumerable<object> args)
        {
        }

        public static AnonymousObject Create(IEnumerable<object> args)
        {
            switch (args.Count())
            {
                case 0: return new AnonymousObject(args);
                case 1: return new AnonymousObject1(args);
                case 2: return new AnonymousObject2(args);
                default: return new AnonymousObject3(args.Take(3));
            }
        }
        private class AnonymousObject1 : AnonymousObject
        {
            public object Item0 { get; }
            public AnonymousObject1(IEnumerable<object> args) : base(args.SkipLast(1))
            {
                Item0 = args.Last();
            }
        }
        private class AnonymousObject2 : AnonymousObject1
        {
            public object Item1 { get; }
            public AnonymousObject2(IEnumerable<object> args) : base(args.SkipLast(1))
            {
                Item1 = args.Last();
            }
        }
        private class AnonymousObject3 : AnonymousObject2
        {
            public object Item2 { get; }
            public AnonymousObject3(IEnumerable<object> args) : base(args.SkipLast(1))
            {
                Item2 = args.Last();
            }
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)