gpt4 book ai didi

c# - 按字符串创建类的实例,但要考虑隐式转换 - C# 反射

转载 作者:太空狗 更新时间:2023-10-29 21:53:20 25 4
gpt4 key购买 nike

我处于这样一种情况,我需要在给定类型(作为字符串)和构造函数参数数组的情况下创建一个对象实例。

我是这样实现的:

public object Create(string Name, params object[] Args)
{
return Activator.CreateInstance(Type.GetType(Name), Args);
}

这在大多数情况下都可以正常工作,但是有一个问题;它不考虑隐式转换。


让我解释一下我的意思,假设我们有一个隐式转换为 int 定义的简单类

public class ImplicitTest
{
public double Val { get; set; }

public ImplicitTest(double Val)
{
this.Val = Val;
}

public static implicit operator int(ImplicitTest d)
{
return (int)d.Val;
}
}

我们有一个使用 int 作为构造函数参数的类

public class TestClass
{
public int Val { get; set; }

public TestClass(int Val)
{
this.Val = Val;
}
}

现在假设我们想要创建一个 TestClass 的实例,我们可以这样做:新测试类(5)。在这种情况下,我们使用构造函数指定的确切参数类型 (int)。但是,我们也可以使用我们的 ImplicitTest 类创建该类的实例,如下所示:new TestClass(new ImplicitTest(5.1))。这是有效的,因为参数从 ImplicitTest 隐式转换为 int。然而,Activator.CreateInstance() 不会这样做。


我们可以使用之前的 Create(string Name, params object[] Args) 方法来创建 TestClass 的实例:Create("ThisNamespace.TestClass", 5) ,这有效。我遇到的问题是尝试使用隐式转换不起作用,因此此代码段会引发错误:Create("ThisNamespace.TestClass", new ImplicitTest(5.1))

我完全不知道如何考虑这一点,但这对我的用例很重要。也许我缺少 Activator.CreateInstance() 函数的某些参数,或者我可以使用完全不同的方法来实现我的目标?我找不到任何答案。


长话短说

//Valid
new TestClass(5);

//Valid
new TestClass(new ImplicitTest(5.1));

//Valid
Activator.CreateInstance(Type.GetType("ThisNamespace.TestClass"), 5);

//Invalid, throws System.MissingMethodException
Activator.CreateInstance(Type.GetType("ThisNamespace.TestClass"), new ImplicitTest(5.1));

为什么?

最佳答案

隐式类型转换是 C# 编译器的一个特性,而不是 CLR。​​

因此,如果你愿意使用反射,你将不得不手动实现它。

关于c# - 按字符串创建类的实例,但要考虑隐式转换 - C# 反射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35870552/

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