我有一个定义了很多规则的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”。是否存在性能差异。
答案 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();