微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决通过反射从动态对象中获取属性

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

无论如何:我有点坚持使用反射在普通“对象”上运行的框架,同时提供来自用户的“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 举报,一经查实,本站将立刻删除。