2009-05-13 7 views
2

Ich versuche, einige allgemeine benutzerdefinierte ValidationAttributes zu entwickeln. Die Tatsache, dass man keine generische Unterklasse eines Attributs erstellen kann, macht mich verrückt.Versuchen, generisch zu werden, wenn generische nicht verfügbar ist

Hier ist mein Code für die IsValid Überschreibung in einem Validation zu überprüfen, ob der Wert einer Immobilie ist einzigartig:

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; 
    } 

Diese Zeile:

Objektcode = table.FirstOrDefault (Prädikat);

Fehler aus:

'Objekt' enthält keine Definition für 'FirstOrDefault' enthalten und ohne Erweiterung ...... usw.

Wie kann ich den Compiler definieren, umwandeln oder anderweitig dazu bringen, "table" als etwas zu erkennen, das eine .FirstOrDefault-Methode verfügbar macht?

Dank

Antwort

2

Sie werden auf eine Art erhalten, die System.Linq.Enumerable verwenden können:

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

Drei betrifft: verwenden

  1. nicht var so viel - du verlierst den Überblick über deine Typen.
  2. Ich bin nicht sicher über die Verwendung Ihres Prädikats in einem FirstOrDefault-Aufruf - ich sehe nicht, wie der Compiler Typ es überprüfen kann. http://msdn.microsoft.com/en-us/library/bb299425.aspx
  3. Wenn Sie das Prädikat Arbeits bekommen, .Any() könnte eine bessere Wahl als .FirstOrDefault sein()
2

Wie definiere ich, gegossen oder auf andere Weise den Compiler zu erkennen, „table“ als etwas, das ein .FirstOrDefault Verfahren aussetzt?

Mit einem expliziten Cast zu IEnumerable<> von etwas. Da Sie das "Etwas" in Ihrem Fall nicht kennen, können Sie FirstOrDefault effektiv nicht verwenden. implementieren Sie einfach die Logik selbst:

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

Ich glaube nicht, das hilft mir, wie ich ein Ausdruck Baum linq2sql erschaffe wird verwenden zu bauen eine SQL-Anweisung. – theBruce

Verwandte Themen