gpt4 book ai didi

c# - 通过匿名类型的反射实例化对象

转载 作者:太空宇宙 更新时间:2023-11-03 20:04:14 24 4
gpt4 key购买 nike

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

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

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

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

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

由于框架方法不支持,有谁有把匿名对象翻译成数组的代码例子吗?请注意,参数的顺序对于 Activator.CreateInstance() 方法很重要,因为这是它进行参数匹配的方式。显然这很容易出错,这就是为什么我更愿意使用匿名类型。

我们很高兴提出任何建议。

亚历克。

最佳答案

我不会为此使用 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");
}

关于c# - 通过匿名类型的反射实例化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24851859/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com