gpt4 book ai didi

c# - 从 shape 派生的类给出了转换错误

转载 作者:太空狗 更新时间:2023-10-29 19:43:32 25 4
gpt4 key购买 nike

我在 UWP 项目中有一个派生自 Windows.UI.Xaml.Shapes.Shape 的类:

public class Hex : Windows.UI.Xaml.Shapes.Shape
{
public Hex()
{

}
}

当我尝试在 mainPage.cs 中实例化此类的新成员时,我得到如下 InvalidCastException:

System.InvalidCastException: Specified cast is not valid.
at Windows.UI.Xaml.Shapes.Shape..ctor()
at App1.Hex..ctor()
at App1.MainPage.Button_Click(Object sender, RoutedEventArgs e)

这是来自 mainPage.cs 的代码

private void Button_Click(object sender, RoutedEventArgs e)
{
var h = new Hex();
h.Width = 20;
}

但两者都不起作用。据我了解,应该能够从派生类访问 Shape 的 protected 构造函数,那么发生了什么?从 Windows.UI.Xaml.Frameworkelemnt 派生做同样的事情没有问题。

最佳答案

TLDR;没有严重的伤害是不可能的。但是……这是可能的。

我从重现问题开始,这里是堆栈跟踪来证明这一点:

   at Windows.UI.Xaml.Shapes.Shape..ctor()
at App1.Hex..ctor()
at App1.App1_XamlTypeInfo.XamlTypeInfoProvider.Activate_0_Hex()
at App1.App1_XamlTypeInfo.XamlUserType.ActivateInstance()

您可以看到 xaml 元素的类型提供程序 (App1_XamlTypeInfo) 是在运行时生成的,因此您不能使用自定义代码覆盖那些 [Factory|Instance Creation|Builder] 方法。

即使尝试在 Hex 类中创建到 Shape 类型的隐式转换也无法修复它,这显然是 C# 的一个限制,即您不能进行从子类到基类的自定义隐式转换,因为“它改变了已经编译的代码”或其他什么:(

另一条路线可能是支持封装而不是继承,您需要重新实现/公开 Shape 类的所有荣耀并操作内部 Shape 实例,但是这是一个限制,因为您不能从 WPF 实现 IShape 和 IShape2 接口(interface),因为它们被标记为内部。

据我所知,剩下的唯一选择是修改 WPF 源代码,然后分发...我不知道与执行此类操作相关的许可问题。参见 https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/Shapes/Shape.cs对于您需要更改的类,或者只包含您自己的派生类型(如 Ellipse),以及 https://referencesource.microsoft.com/#PresentationFramework/PresentationFramework.csproj只是要指出,构建需要引用 非常容易。

希望有人能证明我错了...

关于c# - 从 shape 派生的类给出了转换错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51009681/

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