Im написание кода для передачи данных моих объектов ORM в набор данных. Поскольку я не хочу писать специальный код для каждого типа, определяющий, какие свойства нужно записать, я в настоящее время использую отражение (вызывая GetProperties по типу сущностей, создавая DataTable для этого типа, а затем вызывающий GetValue для каждого Propertyinfo для каждый объект). Статус кво: он работает, но он медленный.Создание функций для извлечения значений свойств, полученных с помощью отражения
Теперь я пытаюсь создать метод, возвращающий функцию, чтобы быстро получить значение определенных свойств, но мне тяжело здесь. Это то, что я получил до сих пор:
/// <summary>
/// creates a func that will return the value of the given property
/// </summary>
/// <typeparam name="T">type of the entity</typeparam>
/// <param name="propertyInfo">the property to get the value from</param>
/// <returns>a function accepting an instance of T and returning the value of the property</returns>
private Func<T, object> CreateGetPropertyFunc<T>(PropertyInfo propertyInfo)
{
MethodInfo getMethod = propertyInfo.GetGetMethod();
return (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>), getMethod);
}
Это мои единичные тесты:
[TestMethod]
public void TestGenerateDelegate()
{
var employee = new Employee
{
Id = 1,
Name = "TestEmployee",
};
Func<Employee, object> getIdValueFunc = CreateGetPropertyFunc<Employee>(typeof(Employee).GetProperty("Id"));
Assert.AreEqual(1, getIdValueFunc(employee));
}
[TestMethod]
public void TestGenerateDelegateName()
{
var employee = new Employee
{
Name = "Test"
};
Func<Employee, object> getNameValueFunc = CreateGetPropertyFunc<Employee>(typeof(Employee).GetProperty("Name"));
Assert.AreEqual("Test", getNameValueFunc(employee));
}
Когда я называю первый, в ArgumentException с сообщением «Исключение при связывании с целевым методом» (перевод, может быть другой текст). Второе испытание проходит вместо этого.
Я уверен, что я неправильно обрабатываю этот метод CreateDelegate. Может ли кто-нибудь указать мне в правильном направлении, пожалуйста?
Update:
Как PetSerAI statet, это, кажется, проблема с дисперсией, значения примитивных типов не могут быть возвращены в качестве объекта через CreateDelegate ...
Делегат возвращаемый тип дисперсии не работает с типами значений. Вы не можете привязать метод, возвращающий 'int', чтобы делегировать возвращаемый объект. – PetSerAl
Вы правы, работая с свойством Name, но не с Id. Как жаль! – Udontknow