gpt4 book ai didi

c# - 装箱值类型的通用拆箱

转载 作者:太空狗 更新时间:2023-10-29 17:45:28 25 4
gpt4 key购买 nike

我有一个受限于结构的通用函数。我的输入被装箱(“对象”)。是否可以在运行时取消装箱值以避免必须检查每种可能的类型并手动进行转换?

看上面的例子:

   public struct MyStruct
{
public int Value;
}

public void Foo<T>(T test)
where T : struct
{
// do stuff
}

public void TestFunc()
{
object o = new MyStruct() { Value = 100 }; // o is always a value type

Foo(o);
}

在示例中,我知道 o 必须是一个结构体(但是,它不需要是 MyStruct ...)。有没有一种方法可以调用 Foo 而无需大量样板代码来检查每种可能的结构类型?

谢谢。

最佳答案

.NET 泛型的实现方式允许值类型作为泛型类型参数,而不会产生任何装箱/拆箱开销。因为您在调用 Foo 之前转换为对象,所以您没有利用它,事实上您甚至根本没有利用泛型。

首先使用泛型的全部意义在于取代“object-idiom”。我认为你在这里错过了这个概念。无论 T 是什么类型,它在运行时都是可用的,因为您将它限制为 struct 保证是一个结构类型。

你的 TestFunc 可以毫无问题地这样写:

public void TestFunc()
{
MyStruct o = new MyStruct() { Value = 100 }; // o is always a value type

Foo<MyStruct>(o);
}

看看 Foo,它在您的示例中看起来像这样:

public void Foo<T>(T test)
where T : struct
{
T copy = test; // T == MyStruct
}

编辑:

好的,因为 OP 阐明了他想调用泛型方法的内容,但不知道他的结构的类型(它只是对象)。使用正确的类型参数调用泛型方法的最简单方法是使用一点反射。

public void TestFunc()
{
object o = new DateTime();

MethodInfo method = this.GetType().GetMethod("Foo");
MethodInfo generic = method.MakeGenericMethod(o.GetType());
generic.Invoke(this, new object[] {o});


}
public void Foo<T>(T test)
where T : struct
{
T copy = test; // T == DateTime
}

关于c# - 装箱值类型的通用拆箱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2759645/

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