IXamlType接口实现 - 奇怪的行为

时间:2012-05-17 08:54:01

标签: c# .net windows-8 windows-runtime winrt-xaml

IXamlType 接口定义如下:

[Guid(0x7920eab1, 0xa2e5, 0x479a, 0xbd, 80, 0x6c, 0xef, 60, 11, 0x49, 0x70), Version(0x6020000), WebHostHidden]
public interface IXamlType
{
    // Methods
    object ActivateInstance();
    void AddToMap([In] object instance, [In] object key, [In] object value);
    void AddToVector([In] object instance, [In] object value);
    object CreateFromString([In] string value);
    IXamlMember GetMember([In] string name);
    void RunInitializer();

    // Properties
    IXamlType BaseType { get; }
    IXamlMember ContentProperty { get; }
    string FullName { get; }
    bool IsArray { get; }
    bool IsBindable { get; }
    bool IsCollection { get; }
    bool IsConstructible { get; }
    bool IsDictionary { get; }
    bool IsMarkupExtension { get; }
    IXamlType ItemType { get; }
    IXamlType KeyType { get; }
    TypeName UnderlyingType { get; }
}

编译Metro应用程序时,会生成 XamlTypeInfo.g.cs ,其中包含此接口的实现,如下所示:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.Windows.UI.Xaml.Build.Tasks", "4.0.0.0")]    
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
internal class XamlSystemBaseType : IXamlType
{
    string _fullName;
    Type _underlyingType;

    public XamlSystemBaseType(string fullName, Type underlyingType)
    {
        _fullName = fullName;
        _underlyingType = underlyingType;
    }

    public string FullName { get { return _fullName; } }

    public Type UnderlyingType
    {
        get
        {
            return _underlyingType;
        }
    }

    virtual public IXamlType BaseType { get { throw new NotImplementedException(); } }
    virtual public IXamlMember ContentProperty { get { throw new NotImplementedException(); } }
    virtual public IXamlMember GetMember(string name) { throw new NotImplementedException(); }
    virtual public bool IsArray { get { throw new NotImplementedException(); } }
    virtual public bool IsCollection { get { throw new NotImplementedException(); } }
    virtual public bool IsConstructible { get { throw new NotImplementedException(); } }
    virtual public bool IsDictionary { get { throw new NotImplementedException(); } }
    virtual public bool IsMarkupExtension { get { throw new NotImplementedException(); } }
    virtual public bool IsBindable { get { throw new NotImplementedException(); } }
    virtual public IXamlType ItemType { get { throw new NotImplementedException(); } }
    virtual public IXamlType KeyType { get { throw new NotImplementedException(); } }
    virtual public object ActivateInstance() { throw new NotImplementedException(); }
    virtual public void AddToMap(object instance, object key, object item)  { throw new NotImplementedException(); }
    virtual public void AddToVector(object instance, object item)  { throw new NotImplementedException(); }
    virtual public void RunInitializer()   { throw new NotImplementedException(); }
    virtual public object CreateFromString(String input)   { throw new NotImplementedException(); }
}

奇怪的是,有些接口实现并不一致。如果您尝试在独立的VS项目中编译此实现,则会出现预期的以下错误:

错误CS0738:'ConsoleApplication28.XamlSystemBaseType'未实现接口成员'ConsoleApplication28.IXamlType.UnderlyingType'。 'ConsoleApplication28.XamlSystemBaseType.UnderlyingType'无法实现'ConsoleApplication28.IXamlType.UnderlyingType',因为它没有匹配的返回类型'ConsoleApplication28.TypeName'。


我的问题是.g.cs如何编译 - 我通过在Reflector中打开编译的程序集来确认 - 它也显示了相同的实现,它对某些属性/方法具有错误匹配的签名类型。

更新

为了确认我看到的内容,我使用了Reflector并看到了以下内容:

IXamlType.UnderlyingType(来自程序集Windows,版本= 255.255.255.255)定义为:

TypeName UnderlyingType { get; }

在任何Metro应用程序中找到的XamlSystemBaseType将UnderlyingType定义为:

   public Type UnderlyingType { get; }

鉴于上述情况,我不明白它是如何运作的!

更新#2

确定 - 在Reflector中打开Windows.winmd文件时,您会看到:

TypeName UnderlyingType { get; }

但是,如果在Visual Studio中执行:

将光标放在以下行的 IXamlType 上:

内部类XamlSystemBaseType:IXamlType

然后按F12,打开的自动生成的定义文件包含:

    public Type UnderlyingType { get; }

所以在我不知道的场景中肯定会发生一些事情!

将某些类型自动映射到其他类型以及与此对应的规则/属性的内容(如果??)的文档将有很大帮助!

2 个答案:

答案 0 :(得分:0)

您的问题似乎是您找到的接口定义将UnderlyingType属性声明为

TypeName UnderlyingType { get; }

虽然生成的基本实现将其定义为:

public Type UnderlyingType ...

好吧,我在VS中打开了XamlTypeInfo.g.cs并导航到IXamlType接口的定义,它实际上将其定义为

Type UnderlyingType { get; }

似乎您找到的接口定义无效。查看UnderlyingType属性的文档,它说该属性的类型是C#中的Type,但是C ++中的TypeName - 可能是你的差异来自哪里。

更大的问题是 - 为什么要尝试在控制台应用程序中编译它?控制台应用程序不使用WinRT。

答案 1 :(得分:0)

这似乎是因为某种叫做“预计类型”的事情而发生的,但是我还没有找到任何关于此的正式文档。我已经在这里开始了另一个问题:

WinRT Projected types documentation