城堡温莎 ITypedFactory组件选择器构造函数参数按类型而不是名称

本文关键字:类型 参数 ITypedFactory 组件 构造函数 选择器 城堡 | 更新日期: 2023-09-27 17:57:13

我正在使用一个外部库,我无法控制对象构造函数的命名约定。有各种构造函数按参数类型进行区分。因此,我想重写类型化工厂中的约定,以按参数的确切名称检索并使用类型。

例如

GenderTemplateViewModel CreateGenderTemplateViewModel();
GenderTemplateViewModel CreateGenderTemplateViewModel(GenderTemplateModel     genderTemplateModel); 
GenderTemplateViewModel CreateGenderTemplateViewModel(GenderTemplateModel     genderTemplateModel, string extraInfo); 

因此,我可以通过类型而不是参数名称来获取正确的构造函数吗?即覆盖哪种方法以及如何覆盖

public class ParameterbyTypeNotNameTypedFactoryComponentSelector :    DefaultTypedFactoryComponentSelector
{
    protected override Type GetComponentType(MethodInfo method, object[] arguments)
    {
        return base.GetComponentType(method, arguments);
    }
    protected override string GetComponentName(MethodInfo method, object[] arguments)
    {
        return base.GetComponentName(method, arguments);
    }
    protected override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {
        return base.GetArguments(method, arguments);
    }
}

城堡温莎 ITypedFactory组件选择器构造函数参数按类型而不是名称

你需要 GetArguments() 方法。以下方法应该有效:

public class ExtendedTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
{
    protected override IDictionary GetArguments(MethodInfo method, object[] arguments)
    {
        if (arguments == null)
        {
            return null;
        }
        ParameterInfo[] parameters = method.GetParameters();
        Arguments arg = new Arguments(new IArgumentsComparer[0]);
        for (int i = 0; i < parameters.Length; i++)
        {
            if (arg.Contains(parameters[i].ParameterType))
            {
                if (this.isFunc(method.DeclaringType))
                {
                    throw new ArgumentException(string.Format("Factory delegate {0} has duplicated arguments of type {1}. Using generic purpose delegates with duplicated argument types is unsupported, because then it is not possible to match arguments properly. Use some custom delegate with meaningful argument names or interface based factory instead.", method.DeclaringType, parameters[i].ParameterType));
                }
            }
            else
            {
                arg.Add(parameters[i].ParameterType, arguments[i]);
            }
            arg.Add(parameters[i].Name, arguments[i]);
        }
        return arg;
    }
    private bool isFunc(Type type)
    {
        return ((type.FullName != null) && type.FullName.StartsWith("System.Func"));
    }
}

注意:这只是DefaultTypedFactoryComponentSelector原始实现的略有不同的版本。

希望这有帮助。