gpt4 book ai didi

c# - 反射 - 带参数调用构造函数

转载 作者:可可西里 更新时间:2023-11-01 09:09:49 31 4
gpt4 key购买 nike

例如,我从加载的程序集中读取类型:

var someType = loadedAssemblies
.Where(a => a != null && a.FullName.StartsWith("MY."))
.SelectMany(a => a.GetTypes())
.Distinct()
.ToArray()[0];

如果 counstructor 有参数,我可以读取它们:

ParameterInfo[] parameters = classType.GetConstructors()[0].GetParameters();

我想使用默认参数值调用构造函数,或者如果参数是枚举,则使用第一个枚举值。如果只有一个参数,并且是枚举,那么它的作用是这样的:

object curObject = Activator.CreateInstance(classType, new object[] { parameters[0].ParameterType.GetEnumValues().GetValue(0) });

参数多了怎么办?我需要创建对象来读取属性:

var propertyInfo = someType.GetProperty("EntityType");
string entityType = propertyInfo.GetValue(curObject, null).ToString();

最佳答案

好吧,您可以创建自己的工厂,并编写一个方法来检查构造函数的类型并运行第一个带有默认值的参数化构造函数:

public static class MyFactory
{
public static T MyCreateInstance<T>()
where T : class
{
return (T) MyCreateInstance(typeof (T));
}

public static object MyCreateInstance(Type type)
{
var parametrizedCtor = type
.GetConstructors()
.FirstOrDefault(c => c.GetParameters().Length > 0);

return parametrizedCtor != null
? parametrizedCtor.Invoke
(parametrizedCtor.GetParameters()
.Select(p =>
p.HasDefaultValue? p.DefaultValue :
p.ParameterType.IsValueType && Nullable.GetUnderlyingType(p.ParameterType) == null
? Activator.CreateInstance(p.ParameterType)
: null
).ToArray()
)
: Activator.CreateInstance(type);
}
}

然后使用这个方法:

var classType = loadedAssemblies
.Where(a => a != null && a.FullName.StartsWith("MY."))
.SelectMany(a => a.GetTypes())
.Distinct()
.ToArray()[0];

var curObject = MyFactory.MyCreateInstance(classType);

// This will return an array of values

object[] values = classType
.GetFields()
.Select(f => f.GetValue(curObject))
.ToArray();

附言这是一个DotNet fiddle example .

Update:

代码会根据您使用的场景进行更改。现在我们有两种方法,一个返回对象,另一个可以将其转换为 T 类型。

我也更新了DotnetFiddle,请检查。

关于c# - 反射 - 带参数调用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40915110/

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