2

私は以下のようにいくつかのコードスニペットを持っています:

実行時に型をチェックして、この状態を解決したい。

PropertyInfo pi = type.GetProperty("propertyName");

var expression = new Object(); // this give me error after expression runs!

    // Want to resolve this conditation by checking the type at runtime.
    if (pi.PropertyType == typeof(DateTime))
            {
               // Want to pass the generic type parameter which has a same type created at runtime by identifying the property type.
                expression = BuildExpression<T, DateTime>(data, group.Member);
            }

private Func<T, V> BuildExpression<T, V>(IEnumerable<T> items, string propertyName)
    {
      Type type = typeof(T);
      PropertyInfo pi = type.GetProperty(propertyName);
      Type PropertyType = pi.DeclaringType;
      var parameter = Expression.Parameter(typeof(T), propertyName);
      var cast = Expression.TypeAs(parameter, pi.DeclaringType);
      var getterBody = Expression.Property(cast, pi);
      var exp = Expression.Lambda<Func<T, V>>(getterBody, parameter);
      return exp.Compile();
    }

問題: タイプに条件を記述しなければならず、リフレクションによってプロパティのタイプをチェックしてから、式を作成する必要があります。

私が欲しいもの: プロパティのタイプのランタイム時間をチェックし、プロパティ タイプと同じタイプのランタイム ジェネリック パラメータを作成したい。

基本的に、型チェックIfの条件を削除したいのですが、条件付きのすべての型をチェックする必要がないように、コードは同じ型を渡す必要があります。のようにautomatically detect the property typeGeneric parameter argumentIfstring, decimal, double etc..

実行時に型を確認し、プロパティが持っているのと同じ型propertyで作成Generic parameter typeしたいので、その解決策を教えてください。

4

1 に答える 1

1

Func<T,V>( objectTおよび member-typeに対して)を返すメソッドを持つことにVは問題があります。これは、実行時にそれを使用して有用なことを実際に行うことができないためです。コンパイル時に and を知らずに型指定されたデリゲートに割り当てることはできず、使用することTはお勧めできません。率直に言って、 を構築して、実行時に処理するだけの方がよいでしょう。リフレクションとジェネリックはうまく混ざりません。VDynamicInvokeFunc<object,object>object

private static Func<object, object> BuildExpression(
    Type type, string propertyName)
{
    var parameter = Expression.Parameter(typeof(object));
    var body = Expression.TypeAs(Expression.PropertyOrField(Expression.TypeAs(
        parameter, type), propertyName), typeof(object));
    return Expression.Lambda<Func<object, object>>(body, parameter).Compile();
}

ただし、その時点で、IMO、FastMemberなどのライブラリに切り替えて、名前ベースのアクセスを使用できます。

var accessor = TypeAccessor.Create(type);
var obj = ...
var propVal = accessor[obj, propertyName];
于 2012-11-06T10:49:52.480 に答える