使用Reflection时,underlyingSystemType是否会破坏类继承?

时间:2015-02-05 21:37:06

标签: c# inheritance reflection enterprise-library system.reflection

很抱歉这个冗长的问题。我想给出一些我需要做的事情以及我面临的问题。如果你觉得你可以在没有背景故事的情况下回答它,我的问题就在底部。 提前致谢!

我需要使用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.MyValidatorMicrosoft.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)) ?有人可以帮助我理解为什么这不符合我的想法吗?

0 个答案:

没有答案