2009-05-13 3 views
2

一般的なカスタムカスタムValidationAttributesを開発しようとしています。属性の一般的なサブクラスを作成できないという事実は、私をナットにしています。ジェネリックが利用できない場合にジェネリックを取得しようとしています

public override bool IsValid(object value) 
    { 
     SomeDataContext context = SomeDataContext.GetNewDataContext(); 
     Type tableType = typeof(Table<>).MakeGenericType(new Type[] { _EntityType }); 
     var table = Activator.CreateInstance(tableType); 
     //ITable table = context.GetTable(_EntityType); 
     var codeProp = (from member in context.Mapping.GetMetaType(_EntityType).DataMembers 
         where member.Name == _PropertyName 
         select member.Member).Single(); 
     ParameterExpression param = Expression.Parameter(_EntityType, "x"); 
     MemberExpression memberExp = Expression.Property(param, (PropertyInfo)codeProp); 
     Expression body = Expression.Equal(memberExp, Expression.Constant(value, typeof(char))); 
     //var predicate = Expression.Lambda<Func<TEntityType, bool>>(body, param); 
     Type lambdaType = typeof(Func<,>).MakeGenericType(_EntityType, typeof(bool)); 
     var predicate = Expression.Lambda(lambdaType, body, param); 
     object code = table.FirstOrDefault(predicate); 
     if (code != null) 
     { 
      return false; 
     } 
     return true; 
    } 

この行:ここ

は、プロパティの値が一意であることを確認するValidationAttributeにIsValidのオーバーライドのための私のコードである

オブジェクトコード= table.FirstOrDefault(述語)。

エラーアウト:

は「オブジェクト」が「FirstOrDefault」と拡張子なし......などの定義が含まれていません。

"テーブル"を.FirstOrDefaultメソッドを公開するものとして認識するようにコンパイラを定義、キャスト、または取得する方法を教えてください。

おかげ

答えて

2

これはSystem.Linq.Enumerableが使用できるタイプにあなたを取得します:

IEnumerable<object> tableGeneric = 
    ((IEnumerable)table).OfType<object>(); 

三懸念:

  1. VARを使用しないでくださいあまりにも多く - あなたはあなたのタイプのトラックを失うでしょう。
  2. FirstOrDefaultの呼び出しで述語を使用することについて私は確信しています。コンパイラがどのようにタイプをチェックできるかはわかりません。 http://msdn.microsoft.com/en-us/library/bb299425.aspx
  3. あなたは述語作業を取得した場合、.ANY().FirstOrDefault(より良い選択かもしれません)
2

は、どのように私は、キャストを定義するか、そうでなければ.FirstOrDefault方法を公開するものとして「表」を認識するようにコンパイラを得るのですか?

IEnumerable<>に明示的にキャストを使用してください。あなたのケースで「何か」が分からないので、事実上FirstOrDefaultを使用することはできません。単にロジックを自分で実装する:

var enumerator = ((IEnumerable)table).GetEnumerator(); 
object code = enumerator.MoveNext() ? enumerator.Value : null; 
+0

私は式ツリーlinq2sqlを構築するために使用されます作成していて、これは私を助けないと思いますSQLステートメント – theBruce

関連する問題