【问题标题】:Instantiate object via reflection with anonymous type通过匿名类型的反射实例化对象
【发布时间】:2014-07-20 15:13:33
【问题描述】:

我正在使用下面的方法通过反射来实例化一个对象

 Activator.CreateInstance(Type type, params object[] parameters)

其中“参数”是在运行时传递给构造函数的参数列表。

但是,我希望这个过程对团队中的其他开发人员来说更直观,而不是传递 object[] 参数数组,我希望他们传递一个匿名对象,例如

 // note, invalid code
 Activator.CreateInstance(typeof(MyType), new { paramName1 = "abc", paramName2 = "xyz})

由于框架方法不支持它,有没有人有将匿名对象转换为数组的代码示例?请注意,参数的顺序对于 Activator.CreateInstance() 方法很重要,因为这就是它进行参数匹配的方式。显然这很容易出错,这就是为什么我更喜欢使用匿名类型。

欢迎提出任何建议。

亚历克。

【问题讨论】:

    标签: c# .net reflection


    【解决方案1】:

    我不会为此使用Activator.CreateInstance。我会使用Type.GetConstructors() 来获取所有构造函数,然后找到一个与匿名类型具有相同数量的参数且具有相同名称的构造函数。如果可能有多个具有不同类型的此类构造函数,则需要添加额外的逻辑来检查每个参数类型是否与相关的属性类型兼容。

    类似:

    public object CreateInstance(Type type, Object parameterMapping)
    {
        var ctors = type.GetConstructors();
        var properties = parameterMapping.GetType().GetProperties();
        foreach (var ctor in ctors)
        {
            var parameters = ctor.GetParameters();
            if (parameters.Length != properties.Length)
            {
                continue;
            }
            object[] args = new object[parameters.Length];
            bool success = true;
            for (int i = 0; i < parameters.Length; 
            {
                var property = parameterMapping.GetType().GetProperty(parameter.Name);
                if (property == null)
                {
                    success = false;
                    break;
                }
                // TODO: Check property type is appropriate too
                args[i] = property.GetValue(parameterMapping, null);
            }
            if (!success)
            {
                continue;
            }
            return ctor.Invoke(args);
        }
        throw new ArgumentException("No suitable constructor found");
    }
    

    【讨论】:

    • 太好了,非常感谢。不知道你可以做 ctor.Invoke()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 2011-01-19
    • 2010-09-11
    • 1970-01-01
    相关资源
    最近更新 更多