很抱歉这个冗长的问题。我想给出一些我需要做的事情以及我面临的问题。如果你觉得你可以在没有背景故事的情况下回答它,我的问题就在底部。 提前致谢!
我需要使用Microsoft.Practices.EnterpriseLibrary来构建XML验证文件。作为Enterprise Library框架的一部分,您可以创建自己的自定义验证器以扩展基本验证器类型(ValueValidator,DateTimeValidator,DomainValidator等)。为此,我必须扩展Microsoft.Practices.EnterpriseLibrary.Validation.Validator抽象类,以便EntLibConfig.exe(框架附带的配置文件编辑器)可以识别哪些类型是它可以与之交互的Validator类型。下面显示了我为实现这个抽象类所做的工作。
CustomValidation.dll:
namespace ValidationHOL.CustomValidators
{
[ConfigurationElementType(typeof (SSNValidator))]
public class MyValidator : Microsoft.Practices.EnterpriseLibrary.Validation.Validator
{
public MyValidator(string tag)
: this(tag, false)
{
}
public MyValidator(string tag, bool ignoreHypens)
: base(string.Empty, tag)
{
}
public MyValidator(NameValueCollection attributes)
: base(string.Empty, string.Empty)
{
}
public override void DoValidate(object objectToValidate,
object currentTarget,
string key,
ValidationResults validationResults)
{
throw new NotImplementedException();
}
protected override string DefaultMessageTemplate
{
get { throw new NotImplementedException(); }
}
}
}
当我尝试将CustomValidation.dll加载到EntLibConfig.exe工具中时,我可以在我的配置文件中使用MyValidator类,没有任何显示!
所以我打开了这个EntLibConfig.exe的源代码,找到了应用程序过滤掉它不知道如何使用的类的地方。
来自Microsoft的Configuration.Console.csproj文件(EnterpriseLibrary框架的一部分):
namespace Microsoft.Practices.EnterpriseLibrary.Configuration.Design.ComponentModel.Editors
{
public class TypeBuildNodeConstraint
{
/* other code here*/
public bool Matches(Type type)
{
if (!this.BaseType.IsAssignableFrom(type))
//if (!this.BaseType.IsAssignableFrom(type))
{
var resolvedType = Type.GetType(type.AssemblyQualifiedName, false);
if (resolvedType == null // couldn't resolve it
|| resolvedType == type // resolve to the same type we had, which already failed to match
|| !this.BaseType.IsAssignableFrom(resolvedType)) // is a different, non-null type but doesn't match
return false;
type = resolvedType; // the new type matches, keep using it
}
if (!this.includeInterfaces && type.IsInterface)
return false;
if (!includeAbstractTypes && (type.IsAbstract && !type.IsInterface))
return false;
if (!this.includeBaseType && (type == this.BaseType))
return false;
if (!includeNonPublicTypes && !(type.IsPublic || type.IsNestedPublic))
return false;
if (this.ConfigurationType != null)
{
var attribute =
type.GetCustomAttributes(typeof(ConfigurationElementTypeAttribute), true)
.Cast<ConfigurationElementTypeAttribute>()
.FirstOrDefault();
if (attribute == null || this.ConfigurationType != attribute.ConfigurationType)
return false;
}
return true;
}
}
}
当我调试到我得到的代码的这一部分;
this.BaseType
变量属于Type
类型,显示类型Microsoft.Practices.EnterpriseLibrary.Validation.Validator
的信息,type
变量的类型为Type
,并显示类型{的信息{1}}。当我的类CustomValidator.MyValidator
在条件为MyValidator
的第一个if语句失败时返回为不匹配。事实证明!this.BaseType.IsAssignableFrom(type)
变量显示type
类有一个MyValidator
而不是我想的UnderlyingSystemType = CustomValidator.MyValidator
。 Microsoft.Practices.EnterpriseLibrary.Validation.Validator
显示type.BaseType
,我认为Microsoft.Practices.EnterpriseLibrary.Validation.Validator
继承自MyValidator
。
所以我的问题是:为什么我这样做并且有效:
Microsoft.Practices.EnterpriseLibrary.Validation.Validator
但这会返回false:
Microsoft.Practices.EnterpriseLibrary.Validation.Validator tmpValidator =
new MyValidator;
为了让这个语句返回true,我需要做些什么特别的事情:
typeof(Microsoft.Practices.EnterpriseLibrary.Validation.Validator)
.IsAssignableFrom(typeof(MyValidator))
?有人可以帮助我理解为什么这不符合我的想法吗?