ORMエンティティのデータをデータセットに転送するコードを記述しています。私は現在、リフレクションを使用しています(エンティティのタイプでGetPropertiesを呼び出し、このタイプのDataTableを構築してから、各PropertyinfoでGetValueを呼び出しています)。各エンティティ)。現状:それは動作しますが、遅いです。反射によって取得されたプロパティの値を取得する関数を作成する
今、私は特定のプロパティの値を高速に取得する関数を返すメソッドを構築しようとしていますが、ここでは苦労しています。これは私がこれまでに得たものである:
/// <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がを呼び出す
(翻訳された、異なるテキストかもしれない)がスローされます。 2回目のテストは代わりに実行されます。私はかなり私はそのCreateDelegateメソッドを正しく処理していないと確信しています。誰も私を正しい方向に向けることができますか?
更新:
PetSerAIのstatetとして、プリミティブ型は、CreateDelegateを経由してオブジェクトとして返すことができない値、分散の問題のようです...
委任戻り値の型の分散が値型では動作しません。 'int'を返すメソッドをバインドして、' object'を返すことを委譲することはできません。 – PetSerAl
あなたは正しいですが、Idプロパティでは動作しません。なんて残念なこと、惜しいこと! – Udontknow