У меня есть идея, как это сделать без использования Expressions
. По-видимому, поскольку Reflection
в c # работает медленно, как объясняется далее в этой статье , я решил использовать библиотеку с именем FastMember , чтобы получить свойства объекта.
==============
Установить FastMember
Выполните следующую команду в PackageManagerConsole, чтобы установить библиотеку.
Install-Package FastMember -Version 1.4.1
Функция записи
Наша функция / метод будет Метод расширения для любого универсального типа, например TEntity
, который должен быть class
и принимает массив полей в качестве параметра для сообщить функции, какие свойства TEntity
возвращать.
using FastMember;
using Dynamic;
using System;
using System.Linq;
using System.Collections.Generic
public static class Utilities
{
public static dynamic GetDynamicFields<TEntity>(this TEntity entity, params string[] fields)
where TEntity : class
{
dynamic dynamic = new ExpandoObject();
// ExpandoObject supports IDictionary so we can extend it like this
IDictionary<string,object> dictionary = dynamic as IDictionary<string,object>;
TypeAccessor typeAccessor = TypeAccessor.Create(typeof(TEntity));
ObjectAccessor accessor = ObjectAccessor.Create(entity);
IDictionary<string,Member> members = typeAccessor.GetMembers().ToDictionary(x => x.Name);
for (int i = 0; i < fields.Length; i++)
{
if (members.ContainsKey(fields[i]))
{
var prop = members[fields[i]];
if (dictionary.ContainsKey(prop.Name))
dictionary[prop.Name] = accessor[prop.Name];
else
dictionary.Add(prop.Name, accessor[prop.Name]);
}
}
return dynamic;
}
}
Как использовать
Использовать метод просто и можно сделать так:
Message msg = new Message();
dynamic result = msg.GetDynamicFields("Id","Text");
В c # dynamic
является примером ExpandoObject
. Посмотрев на код для ExpandoObject
, я понял, что он реализует IDictionary<string,object>
. Следовательно, это означает, что мы можем расширить его и добавить к нему динамические свойства во время выполнения, что облегчит нам задачу.
TestCase Time
Выполнение тестового примера по вышеуказанному методу с использованием NUnit , занимает примерно 40 мс , что звучит достаточно хорошо.
Надеюсь, что это решение подойдет вам или, возможно, даст вам идеи о том, как решить вашу проблему.
Ура!