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; }
所以在我不知道的场景中肯定会发生一些事情!
将某些类型自动映射到其他类型以及与此对应的规则/属性的内容(如果??)的文档将有很大帮助!
答案 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)
这似乎是因为某种叫做“预计类型”的事情而发生的,但是我还没有找到任何关于此的正式文档。我已经在这里开始了另一个问题: