インターフェイスのプロパティ名を表す文字列を式に変換する必要があります。私はそれのほとんどを機能させていますが、最後に理解できないのは1つだけです。
static Expression<Func<T, int>> MakeGetter<T>(string propertyName)
{
var input = Expression.Parameter(typeof(T));
var property = typeof(T).GetProperty(propertyName) ??
GetProperty(propertyName, typeof(T));
var expr = Expression.Property(input, property);
var propType = property.PropertyType.Name;
switch (propType.ToLower())
{
case "string":
return Expression.Lambda<Func<T, string>>(expr, input);
case "int":
return Expression.Lambda<Func<T, int>>(expr, input);
}
}
private static PropertyInfo GetProperty(string propertyName, Type i)
{
var baseInterfaces = i.GetInterfaces();
foreach (var baseInterface in baseInterfaces)
{
var property = baseInterface.GetProperty(propertyName);
return property ?? GetProperty(propertyName, baseInterface);
}
return null;
}
私が抱えている 1 つの問題は、MakeGetter 関数の最後にあることです。関数が文字列なのか、int なのか、それとも他の型なのかがわからず、すべてのリフレクションを実行するまで知る方法がありません。このメソッドを作成して、ジェネリックで Expression を正しく返すようにします。