gpt4 book ai didi

C# (+WPF) 将泛型类转换为非泛型时出现问题

转载 作者:行者123 更新时间:2023-11-30 19:50:39 26 4
gpt4 key购买 nike

老实说,我不太了解类型转换,但我认为这会奏效。

我有一个通用类测试:

public class Test<T,U>
{
T variable1;
U variable2;

//etc.
}

我需要在 WPF View 中使用此类,并且由于您无法在 WPF 中创建通用 View (多么可爱)我想:让我们只使用 Test<object, object > 对于 View ,因为我只关心处理 View 中变量的字符串表示。

所以我尝试:

  Test<Foo, Bar> test = new Test<Foo, Bar>();
return test as Test<object, object>;

但这给了我:

  Error 1   Cannot convert type 'DomainModel.Tests.Test<T,U>' 
to 'DomainModel.Tests.Test<object,object>' via a reference conversion, boxing
conversion, unboxing conversion, wrapping conversion, or null type conversion

我认为每个对象都必须可以转换为对象?

无论如何,我现在对如何在 WPF 中使用泛型类一头雾水...

有正确方向的指针吗?

最佳答案

这是一个普遍的方差问题。 C# 3 不允许泛型参数类型的变化:因此,IEnumerable<string>IEnumerable<object> 不兼容.对于 C# 4 中的安全场景,将放宽此限制。但这对您的情况没有帮助,因为 C# 4 仅支持接口(interface)或委托(delegate)的变化。即使 C# 的 future 版本允许类的通用变体,它仍然可能对您没有帮助,因为不清楚 Test<object, object>是一个安全的转换:假设 variable1 有一个 setter:

Test<string, string> t = new Test<string, string>();
Test<object, object> bad_t = t as Test<object, object>;
bad_t.variable1 = new Llama(); // but variable1 should contain only strings!

但是你可以“转换”一个Test<string, string>object :

object good_t = t;  // don't even need a cast

WPF 绑定(bind)仍然可以通过反射访问其属性。

或者,定义一个提供您需要的功能的非泛型接口(interface)(在您的情况下为“变量的字符串表示”):

public interface IPresentV1AndV2  // stupid name of course
{
public string Variable1AsString { get; }
public string Variable2AsString { get; }
}

并在您的泛型类上实现它。然后,您可以通过接口(interface)成员访问字符串化值。 (很明显,这个特定的接口(interface)示例愚蠢地绑定(bind)到实现,实际上您会给它一个名称和成员,以反射(reflect)它公开的数据的业务含义。)

关于C# (+WPF) 将泛型类转换为非泛型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2030933/

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