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