动态加载规则引擎的类

时间:2011-10-04 23:40:01

标签: c# asp.net reflection

我有一个定义了很多规则的XML文件。 我将XML文件加载到我的规则引擎中。

根据我加载的XML文件,我需要选择哪个命名空间,我将找到我需要的类。然后在XML的每一行上,我需要确定要加载的类。

我的XML

<RuleList assembly="BMW">
 <rule>
    <code>2345</code>
    <errorMessage>foo bar</errorMessage>
    <order>1</order>
 </rule>
</RuleList>
<RuleList assembly="FORD">
 <rule>
    <code>0045</code>
    <errorMessage>foo bar</errorMessage>
    <order>3</order>
 </rule>
</RuleList>

我一次只处理一个规则列表。

我是否应该为定义要加载的ClassName的每个规则添加额外的XML属性? 因为我不想将代码用作类名?或者我可以将代码作为属性添加到我的类中并使用它来动态加载它

例如

namespace FORD 
{
   [code=0045]
   public bool IsValidColor(foo) : IisValid
   {
      return true
   }
}

我可以从[code = 0045]加载类,还是应该在XML中存储“IsValidColor”。是否存在性能差异。

2 个答案:

答案 0 :(得分:1)

任何一种选择都会有类似的表现。如果错误代码,错误消息和顺序在XML文件中永远不会发生变化,您甚至可以在属性中包含有关规则的所有元数据,并在运行时枚举所有实现IisValid的类:< / p>

[Rule(Code = "0045", ErrorMessage = "foo bar", Order = 1)]
public class IsValidColor : IisValid
{
    public bool IsValid(Foo bar)
    {
        // validation rules here
    }
}

但是,如果所有这些都是可自定义的,我个人会让XML文件指定要使用的类的名称。

答案 1 :(得分:1)

您的属性语法不起作用。但是,如果您创建[Code("0045")],则会CodeAttribute之类的内容。

会有一些性能差异,因为您必须根据程序集中所有类型的属性找到正确的类型。但差异很可能是微不足道的。

要实际执行此操作,请按以下方式定义属性:

[AttributeUsage(AttributeTargets.Class)]
class CodeAttribute : Attribute
{
    public CodeAttribute(string code)
    {
        Code = code;
    }

    public string Code { get; private set; }
}

然后找到这样的课程:

var type =
    (from t in assembly.GetTypes()
     let attr = (CodeAttribute)t
                   .GetCustomAttributes(typeof(CodeAttribute), false)
                   .SingleOrDefault()
     where attr != null && attr.Code == code
     select t)
    .Single();