C# 属性从泛型方法获取其类型

C# 属性从泛型方法获取其类型,c#,generics,methods,C#,Generics,Methods,在我的业余时间,我正在创建一个小企业框架,我可以在我的学校项目中重用它。我想这将类似于一个简化的CSLA,如果这能给你一个想法的话 不过,我在使用业务规则类时遇到了一些问题。下面是它现在的样子: public class Rule { public string PropertyName { get; } public string Description { get; } public Func<object, bool> ValidationRule {

在我的业余时间,我正在创建一个小企业框架,我可以在我的学校项目中重用它。我想这将类似于一个简化的CSLA,如果这能给你一个想法的话

不过,我在使用业务规则类时遇到了一些问题。下面是它现在的样子:

public class Rule
{
    public string PropertyName { get; }
    public string Description { get; }
    public Func<object, bool> ValidationRule { get; }

    public Rule(string propertyName, string message, Func<object, bool> validationRule)
    {
        this.PropertyName = propertyName;
        this.Description = description;
        this.ValidationRule = validationRule;
    }

    public bool IsBroken(object value)
    {
        return ValidationRule(value);
    }
}
公共类规则
{
公共字符串PropertyName{get;}
公共字符串描述{get;}
公共函数验证规则{get;}
公共规则(字符串属性名称、字符串消息、Func validationRule)
{
this.PropertyName=PropertyName;
这个。描述=描述;
this.ValidationRule=ValidationRule;
}
公共布尔值已断开(对象值)
{
返回ValidationRule(值);
}
}
当我检查规则是否被打破(值可以是任何类型)时,我不是一个拳击和拆箱的超级粉丝

当然,我可以让整个类成为泛型,让我的isbreak函数接受类型为T的对象(可能比使用对象更好),但我想知道是否有可能执行类似于以下的操作:

public class Rule
{
    public Func<T, bool> ValidationRule { get; }
    public bool IsBroken<T>(T value)
    {
        return ValidationRule(value);
    }
}
公共类规则
{
公共函数验证规则{get;}
公共布尔值已断开(T值)
{
返回ValidationRule(值);
}
}
不使用泛型类型声明类

欢迎提供任何其他提示

我想知道是否可以做类似于以下的事情:
[…]
不使用泛型类型声明类


不,不可能。编译器和/或运行时如何知道属性声明的类型是T?

将规则类声明为泛型是唯一的方法,而且这对您来说很有趣,因为您需要在T泛型上设置约束

 public class Rule<T>
    {
        public Func<T, bool> ValidationRule { get; }
        public bool IsBroken<T>(T value)
        {
            return ValidationRule(value);
        }
    }
公共类规则
{
公共函数验证规则{get;}
公共布尔值已断开(T值)
{
返回ValidationRule(值);
}
}

跨方法/属性共享引入的泛型类型的唯一方法是将它们移动到(或“a”)类声明中。在这种情况下,这似乎是适当的。然后,还要实现一个接口,比如说
IRule
,该接口将支持“非类型对象访问”(并允许将这些规则推入混合
Rule
集合或诸如此类)。然后可以使用特定的
规则
,或者在无法处理
规则
的情况下,可以使用不太精细的
IRule
。如果我没有弄错,可以使用
typeof
System.Type
类中的某些内容来确定类型,只需将对象作为
动态
传递并强制转换它。如果在调用IsBreak时知道T,那么在实例化规则对象时可能知道T,为什么不将其更改为
规则
?查看我的编辑-方法在非泛型类中可以是泛型的,但是属性不是。关键字
dynamic
会在运行时强制验证所有相关函数,绕过该限制。@AlexeiLevenkov这里没关系。即使可以为属性引入新的泛型类型,它也将是不同的类型。。想象一下,如果有两种方法(通过post可以引入新的泛型类型)都引入了
T
;每个方法都是不同的
T
。@AlexeiLevenkov可能没有足够的用例/回报来允许
Func Prop{get;set;}
(其中T在这个假设代码中是“属性泛型”)或类似的属性定义。。这里有一个类似的问题。@pst,我不确定我是否遵循了你对我的编辑的建议。。。您的链接/注释似乎是这样说的:与方法不同,在非泛型类中不能有泛型属性。