C# 如何定义MarkupExtension提供的值的类型?

C# 如何定义MarkupExtension提供的值的类型?,c#,xaml,types,markup-extensions,C#,Xaml,Types,Markup Extensions,我在xaml中遇到一个问题,自定义标记扩展名的ProvideValue返回一个字符串,但xaml“compilation”不知道这一点,并给出以下错误:字典的键不能是“MyNamespace.MyExtension”类型。只支持String、TypeExtension和StaticExtension。这是一个不幸的错误,因为我知道提供的值实际上是一个字符串,根据错误消息,它是一个可接受的类型。下面是一个重现错误的示例: 分机代码: [MarkupExtensionReturnType(typeo

我在xaml中遇到一个问题,自定义
标记扩展名
ProvideValue
返回一个字符串,但xaml“compilation”不知道这一点,并给出以下错误:
字典的键不能是“MyNamespace.MyExtension”类型。只支持String、TypeExtension和StaticExtension。
这是一个不幸的错误,因为我知道提供的值实际上是一个字符串,根据错误消息,它是一个可接受的类型。下面是一个重现错误的示例:

分机代码:

[MarkupExtensionReturnType(typeof(String))]
public class MyExtension : MarkupExtension
{
    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return "Hello World!";
    }
}
用法:

<sys:Double x:Key="{my:MyExtension}">99</sys:Double>
99

EDIT2:简化了问题,因为我在测试后发现它可能更具体

要解决您的问题,您可以使
MyExtension
继承自
StaticExtension
TypeExtension
(都来自
System.Windows.Markup
)。这看起来并不干净,因为
MyExtension
TypeExtension
StaticExtension
无关,但这是我所知道的绕过编译时检查的唯一方法,该检查确保资源键仅属于
String
TypeExtension
StaticExtension
类型


TypeExtension
StaticExtension
继承后,如果您直接从
MarkupExtension
继承(因此您只需用当前实现重写
ProvideValue
),那么就没有什么事情可做了。

您是否尝试过将
[MarkupExtensionReturnType]放入
在你的课堂上?我不知道这个属性存在!听起来正是我需要的。。然而,不幸的是,使用它似乎没有任何效果。。更新帖子以反映此更改您似乎可以通过继承
TypeExtension
而不是
MarkupExtension
(这有点脏,因为标记扩展与
TypeExtension
没有任何关系)绕过错误再次覆盖
ProvideValue
,但我没有尝试真正使用该资源。如果您可以为
MyDictionaryExtension
提供一个示例用例(例如,使用其中的一个资源设置文本框的文本),为字典添加一个使用示例,将检查TypeExtension在以后/明天是否有帮助,而让扩展从TypeExtension继承似乎不是一个非常干净的方法(事实上,扩展并不是一个类型扩展),它确实有效。我将更新这个问题,因为我已经设法简化了用例。