首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ValidationAttribute剩余

ValidationAttribute剩余
EN

Stack Overflow用户
提问于 2009-05-13 22:27:45
回答 1查看 646关注 0票数 0

参考:Creating a ValidationAttribute to ensure unique column values.

好的..。让我们尝试重新构造这个问题:

我从here中删除了以下代码:

代码语言:javascript
复制
    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扩展方法,有我需要的东西。但是,它需要我没有可用的泛型部分--属性不允许泛型子类,所以.

我已经黑了这个密码:

代码语言:javascript
复制
    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;
    }

这句话很糟糕:

代码语言:javascript
复制
        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);

所以,我被困住了。外面有什么想法吗?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-05-29 08:21:52

您可能要寻找的最终结果是,据我所知,您真正想要的方法如下:

代码语言:javascript
复制
public bool IsValid<TEntity>()
{
    // validation logic goes here
}

这样您就可以执行所需的检查,但是您需要在一个只有运行时类型可用的方法中实现它:

代码语言:javascript
复制
public bool IsValid(Type entityType)
{
    // ???
}

如果是这样,则使用所需的逻辑实现第一个代码块,并将第二个方法实现为:

代码语言:javascript
复制
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()的委托,这样就不必对给定类型多次使用慢反射来执行类型绑定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/860750

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档