2016-05-08 9 views
1

要件に基づいて、以下の動的オブジェクトに動的に生成されたプロパティ名を渡す必要があります。動的プロパティ名でオブジェクトを作成し、System.Linq.Expressionsで解析する方法は?

var dynamicObj = new { State = "Caifornia" }; 

代わりに、任意の名前を渡すことができます。ここまでは私のコードです。すべてが機能しますが、プロパティ名を動的にする方法を理解できません。 var dynamicObj = new { "State" = "Caifornia" };

var rule = new Rule("State", "NotEqual", "Florida"); 
var dynamicObj = new { State = "Caifornia" }; 
var expression = Expression.Parameter(dynamicObj.GetType(), "State"); 
var property = Expression.Property(expression, "State"); 
var propertyType = dynamicObj.GetType().GetProperty(rule.MemberName).PropertyType; 

var isValid = false; 
ExpressionType tBinary; 

if (Enum.TryParse(rule.Operator, out tBinary)) 
{ 
     var right = Expression.Constant(Convert.ChangeType(rule.TargetValue, propertyType)); 
     var result = Expression.MakeBinary(tBinary, property, right); 
     var func = typeof(Func<,>).MakeGenericType(dynamicObj.GetType(), typeof(bool)); 
     var expr = Expression.Lambda(func, result, expression).Compile(); 
     isValid = (bool)expr.DynamicInvoke(dynamicObj); 
} 

return isValid; 
+1

コンパイル時にプロパティを持つ適切な型を作成します。 –

+0

ありがとう@JonSkeet – German

答えて

1

ないようExpandoObjectで、このような:

var rule = new Rule("State", "NotEqual", "Florida");    
    var dynamicObj = (IDictionary<string, object>) new ExpandoObject();    
    dynamicObj.Add("State", "California"); 
    var expression = Expression.Parameter(typeof(object), "arg"); 
    // create a binder like this 
    var binder = Microsoft.CSharp.RuntimeBinder.Binder.GetMember(CSharpBinderFlags.None, "State", null, new CSharpArgumentInfo[] { 
      CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null) 
     }); 
    // define dynamic property accessor 
    var property = Expression.Dynamic(binder, typeof(object), expression);   
    // the rest as usual 
    var isValid = false; 
    ExpressionType tBinary; 

    if (Enum.TryParse(rule.Operator, out tBinary)) 
    { 
     var right = Expression.Constant(rule.TargetValue); 
     var result = Expression.MakeBinary(tBinary, property, right); 
     var func = typeof(Func<,>).MakeGenericType(dynamicObj.GetType(), typeof(bool)); 
     var expr = Expression.Lambda(func, result, expression).Compile(); 
     isValid = (bool)expr.DynamicInvoke(dynamicObj); 
    } 
私は強く匿名型はコンパイラが必要なので、あなたは、これを実行することはできません疑う
+0

それは動作します。ありがとう@Evk – German

0

あなたはsomoeタイプで、前に定義properitesからanonimousタイプの使用LINQを作成することができますが、動的プロパティを作成するために、カントのようなもの。 enum(california、floridaなど)を使用すると、このプロパティの名前が表示されます。あなたは匿名型でそれを行うことができますが、あなたが行うことができることを確認

関連する問題