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,Version=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; }
所以在我不知道的场景下肯定发生了一些事情!
什么(如果??)某些类型自动映射到其他类型的文档以及与此相对应的规则/属性将有很大帮助!