メトロで継承されたすべてのクラスを取得しようとしたときに行き詰まりました。WinRT API は .net フレームワークとは異なるため、両方のソリューション ( solution1とsolution2 ) は機能しません。
任意のコードまたはツール ソリューションを歓迎します。
私はまだ試しています。成功した場合、ここに私のソリューションを入れます。
これは機能するはずです( hereのコードに基づいて):
public IEnumerable<T> GetEnumerableOfType<T>(params object[] constructorArgs) where T : class, IComparable<T>
{
List<T> objects = new List<T>();
foreach (Type type in typeof(T).GetTypeInfo().Assembly.ExportedTypes
.Where(myType => myType.GetTypeInfo().IsClass &&
!myType.GetTypeInfo().IsAbstract &&
myType.GetTypeInfo().IsSubclassOf(typeof(T))))
{
objects.Add((T)Activator.CreateInstance(type, constructorArgs));
}
objects.Sort();
return objects;
}
基本的に、 はリフレクション操作を行うためのメイン クラスになり、 を呼び出すことでTypeInfo
取得できます。GetTypeInfo()
Type
ダミール・アーありがとう。変更はほとんど必要ありませんが、ソリューションは優れています。
私が観察したことの1つは、静的メソッドをMainPageクラスに入れることができないか、コンパイルエラーが発生することです。おそらく、初期化中のxamlが競合していることが原因です。
一方、元のコードを、実行時エラーがはるかに少ない、より単純で便利なコードに変更しました(objects.Add((T)Activator.CreateInstance(type, constructorArgs));
多くの場合、の行は実行時エラーにつながります)。主な目的は、結局のところ、すべての継承されたクラスを取得することです。
// GetTypeInfo() returns TypeInfo which comes from the namespace
using System.Reflection;
public List<Type> GetEnumerableOfType<T>(params object[] constructorArgs) where T : class
{
List<Type> objects = new List<Type>();
IEnumerable<Type> s = typeof(T).GetTypeInfo().Assembly.ExportedTypes.Where(myType => myType.GetTypeInfo().IsClass &&
!myType.GetTypeInfo().IsAbstract &&
myType.GetTypeInfo().IsSubclassOf(typeof(T)));
foreach (Type type in s)
objects.Add(type);
return objects;
}
そして、以下はテストサンプルです。
var list = GetEnumerableOfType<UIElement>();
foreach (var v in list)
Debug.WriteLine(v.Name);