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 で開いて確認しました。また、一部のプロパティ/メソッドのシグネチャ タイプが一致しない同じ実装も示されました。
アップデート:
私が見たものを確認するために、リフレクターを使用し、次のことを確認しました。
IXamlType.UnderlyingType (アセンブリ Windows から、バージョン = 255.255.255.255) は次のように定義されます。
TypeName UnderlyingType { get; }
どの Metro アプリにもある XamlSystemBaseType は、UnderlyingType を次のように定義します。
public Type UnderlyingType { get; }
上記を考えると、私はそれがどのように機能するのか理解していません!
アップデート #2
OK - Reflector で Windows.winmd ファイルを開くと、次のように表示されます。
TypeName UnderlyingType { get; }
ただし、Visual Studio で行う場合:
次の行のIXamlTypeにカーソルを置きます。
内部クラス XamlSystemBaseType : IXamlType
次にF12 を押すと、自動生成された定義ファイルが開きます。
public Type UnderlyingType { get; }
だから、私が気づいていないシーンで何かが起こっていることは間違いありません!
一部のタイプが他のタイプに自動マッピングされるもの (if??) のドキュメントと、これに対応するルール/属性は非常に役立ちます!