gpt4 book ai didi

c# - 用反射找到合适的构造函数?

转载 作者:行者123 更新时间:2023-12-02 01:24:41 28 4
gpt4 key购买 nike

在根据传递的参数查找正确的构造函数时,我遇到了一些反射问题。

到目前为止,当传递的构造函数参数不为 null 时,这段代码可以正常工作:

public static ConstructorInfo? FindSuitableConstructor(Type typeWithConstructorToFind, object?[] constructorArguments)
{
return typeWithConstructorToFind.GetConstructor(
constructorArguments.Select(constructorArgumentInstance => constructorArgumentInstance.GetType())
.ToArray());
}

但是一旦涉及 null ,它就会崩溃,因为它无法在 null 上调用 GetType()

寻找合适的构造函数有哪些替代方法?我也在考虑检查参数的数量和参数类型(但同样,它不适用于 null),但到目前为止还没有接近我正在寻找的内容。

我知道 Activator.CreateInstance(typeWithConstructorToFind, constructorArguments) 可以以某种方式找到正确的构造函数,但我不需要该类型的实例,我真的需要 ConstructorInfo.

最佳答案

您可以尝试使用Binder.BindToMethod :

public static ConstructorInfo? FindSuitableConstructor(Type typeWithConstructorToFind, object[] constructorArguments) {
if (constructorArguments == null)
throw new ArgumentNullException("constructorArguments");
var constructors = typeWithConstructorToFind.GetConstructors();
var argsCopy = constructorArguments.ToArray();
try {
return (ConstructorInfo)Type.DefaultBinder.BindToMethod(BindingFlags.Instance | BindingFlags.Public, constructors, ref argsCopy, null, null, null, out _);
}
catch (MissingMemberException) {
return null;
}
}

它将根据传递的参数在一组方法(在本例中为构造函数)中选择最佳匹配。这比尝试自己做要好,因为有一些微妙的情况。请注意,如果有多个构造函数与您的参数匹配,则不一定会失败。例如:

public class Test {
public Test(long x, string y) {

}

public Test(long x, object y) {

}
}

如果我们尝试:

FindSuitableConstructor(typeof(Test), new object[] { 1, null });

理论上两者都匹配,它将返回第一个带有string参数的构造函数,因为你确实可以这样做:

new Test(1, null);

编译器将选择string重载。但是,如果您有这样的例子:

public class Test {
public Test(long x, string y) {

}

public Test(long x, MethodInfo y) {

}
}

那么同样的操作也会失败,并出现 AmbigouslyMatchException,因为实际上无法选择(并且 new Test(1, null) 在这种情况下将无法编译)。

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

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