2017-01-19 8 views
0

が含まれている場合は、オブジェクトからプロパティを取得し、確認し、私はそのプロパティが特定の値が含まれている場合は、オブジェクトからプロパティを取得し、チェックを使用しようとしています:それは価値

public static object GetProp(object obj, string propName, value) 
    { 
     return obj.GetType().GetProperty(propName).GetValue(obj).Contains(value); 
    } 

この:プロパティを取得する

方法は次のようになります私はオブジェクトの値を取得します。

と使用(私はachiveしようとしています何actualyされるか)である:

 string value = this._predicateFilter.GetValueOrDefault(refName, string.Empty); 
     if (!string.IsNullOrEmpty(value)) 
     { 
      predicate.And(c => Assets.Extensions.GetProp(c, "name", "value to compare")); 
     } 

私は例外取得しています:

'object' does not contain a definition for 'Contains' and the best 
extension method overload 'Queryable.Contains<string> 
(IQueryable<string>, string)' requires a receiver of type 
'IQueryable<string>'  

をそして、私は問題は、LINQとエンティティフレームワークで何かだと思いますそのメソッドを本体内で実行することはできません。

私はのような厄介なソリューションを使用することができます。

 string firstname = this._predicateFilter.GetValueOrDefault("Firstname", string.Empty); 
     if (!string.IsNullOrEmpty(firstname)) 
     { 
      predicate.And(c => c.Firstname.Contains(firstname)); 
     } 

     string lastname = this._predicateFilter.GetValueOrDefault("Lastname", string.Empty); 
     if (!string.IsNullOrEmpty(lastname)) 
     { 
      predicate.And(c => c.Lastname.Contains(lastname)); 
     } 

魔女は私がpreffer少ないコードをウォルド、正常に動作しますが、私は何をしないのですか?

OHおよびdoesn't プロパティを返すlinqKit

+0

[C#のリフレクションを使用して文字列からプロパティ値を取得]の可能な複製(http://stackoverflow.com/questions/1196991/get-property-value-from-string-using-reflection-in-c-sharp) –

+1

あなたのコードを更新し、さらに多くのエラーを追加しました... – TheLethalCoder

答えて

1

PropertyInfo.GetValueあなたはIQueryable<T>として使用しようとしているobjectを返します。

objectには、Containsの(拡張)メソッドが含まれていないというエラーが表示されます。また、更新されたコードでは、を返すときに、objectという戻り値の型をvalueから逃しました。

ので、これらのエラーを修正し、IQueryable<T>からContainsキャスト、それを呼び出す前に:

public static bool GetProp(object obj, string propName, string value) 
{ 
    object o = obj.GetType().GetProperty(propName).GetValue(obj); 

    IQueryable<object> queryable = o as IQueryable<object>; 
    if (queryable != null) 
    { 
     return queryable.Contains(value); 
    } 

    return false; //Some other default 
} 
4

Type.GetPropertyから

var predicate = PredicateBuilder.New<Candidate>(); 

を使用してイムが、その性質そのもののためPropertyInfo。あなたが望むのは、与えられたインスタンスのプロパティ値を取得することです。あなたのケースでは、objです。だからあなたのGetProp -methodでこれを使用します。

return obj.GetType().GetProperty(propName).GetValue(obj); 
+0

私はプロパティの値を取得しますが、例外を削除しません –

+0

これは 'GetValue'が単に' object'を返すので、これを'IQueryAble'。とにかくあなたの編集はこの質問を全く新しいものに変えます。 – HimBromBeere

+0

@HimBromBeere更新されたコードでエラーが追加されましたが、初期のエラーの原因は私の答えと同じです。 – TheLethalCoder

0

を次のように試してみてください。

public static bool PropEquals<TProp>(object obj, string propName, TProp valueToTest) 
{ 
    return EqualityComparer<TProp>.Default. 
     Equals(valueToTest, obj.GetType().GetProperty(propName).GetValue(obj)); 
} 

... 

string value = this._predicateFilter.GetValueOrDefault(refName, string.Empty); 
if (!string.IsNullOrEmpty(value)) 
{ 
    predicate.And(c => Assets.Extensions.PropEquals(c, "name", "value to compare")); 
} 

PropEqualsかどうかプロパティは、名前に応じて、trueまたはfalseを返します。指定した値と同じ値が指定されています。

関連する問題