参考:Creating a ValidationAttribute to ensure unique column values.
好的..。让我们尝试重新构造这个问题:
我从here中删除了以下代码:
static TEntity Get<TEntity, TKey>(this DataContext ctx, TKey key) where TEntity : class
{
var table = ctx.GetTable<TEntity>();
var pkProp = (from member in ctx.Mapping.GetMetaType(typeof(TEntity)).DataMembers
where member.IsPrimaryKey
select member.Member).Single();
ParameterExpression param = Expression.Parameter(typeof(TEntity), "x");
MemberExpression memberExp;
switch (pkProp.MemberType)
{
case MemberTypes.Field: memberExp = Expression.Field(param, (FieldInfo)pkProp); break;
case MemberTypes.Property: memberExp = Expression.Property(param, (PropertyInfo)pkProp); break;
default: throw new NotSupportedException("Invalid primary key member: " + pkProp.Name);
}
Expression body = Expression.Equal(
memberExp, Expression.Constant(key, typeof(TKey)));
var predicate = Expression.Lambda<Func<TEntity, bool>>(body, param);
return table.Single(predicate);
}这是一个DataContext扩展方法,有我需要的东西。但是,它需要我没有可用的泛型部分--属性不允许泛型子类,所以.
我已经黑了这个密码:
public override bool IsValid(object value)
SomeDataContext context = SomeDataContext.GetNewDataContext();
var 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)));
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;
}这句话很糟糕:
object code = table.FirstOrDefault(predicate);正如我所说的,here的答案是没有帮助的。
var enumerator = ((IEnumerable)table).GetEnumerator();object code = enumerator.MoveNext() ? enumerator.Value : null;在我构建表达式tree.
IEnumerable<object> tableGeneric = ((IEnumerable)table).OfType<object>();的尝试中没有用。当我尝试:
object code = tableGeneric.FirstOrDefault(predicate);
所以,我被困住了。外面有什么想法吗?
谢谢。
发布于 2009-05-29 08:21:52
您可能要寻找的最终结果是,据我所知,您真正想要的方法如下:
public bool IsValid<TEntity>()
{
// validation logic goes here
}这样您就可以执行所需的检查,但是您需要在一个只有运行时类型可用的方法中实现它:
public bool IsValid(Type entityType)
{
// ???
}如果是这样,则使用所需的逻辑实现第一个代码块,并将第二个方法实现为:
public bool IsValidWrapper(Type entityType)
{
// You may want to be stricter than this, but the essence is to
// get a handle to the generic method first...
MethodInfo genMethod = GetType().GetMethod("IsValid");
// Bind it to the type you want to operate on...
MethodInfo method = genMethod.MakeGenericMethod(entityType);
// And invoke it...
return (bool) method.Invoke(this, null);
}它不会赢得任何选美比赛或表演冠冕,但它会得到你所需要的。请注意,如果性能有问题,则可以从Type查找带有签名bool delegate()的委托,这样就不必对给定类型多次使用慢反射来执行类型绑定。
https://stackoverflow.com/questions/860750
复制相似问题