2016-10-14 21 views
2

私はUWPでContentプロパティの名前を取得する方法は?

public string GetContentProperty(Type type) 
{ 
    var contentPropertyAttribute = type.GetTypeInfo().GetCustomAttribute<ContentPropertyAttribute>(); 
    return contentPropertyAttribute?.Name; 
} 

で試してみた。しかし、それは常にnullを返します。

WPFでは問題なく動作します。

+0

:)とにかく、私は混乱に – SuperJMN

+0

てみてくださいを避けるために、WPFタグを削除します 'IntrospectionExtensions.GetTypeInfo(タイプ).GetCustomAttribute ();私は、誰かが私たちに与えることを願っ' – Enfyve

答えて

1

私は本当に必要な以上にこれを見てきましたが、まだ完全な答えは分かりません。他の誰かが来て、より良い選択肢を提供してくれることを心から祈っています。

UWPでは、GetCustomAttributes()を呼び出すと空の列挙が返されます。最初は、これはUWPアセンブリで行われたタイプストリッピングと関係があると思っていましたが、「.NETネイティブツールでコンパイル」オプションを有効にせずにDebugビルドで問題を再現できるので、アセンブリに完全な型情報を含める必要があります。そして、たとえDefault.rd.xmlファイルに<Type Name="Windows.UI.Xaml.Markup.ContentPropertyAttribute" Dynamic="Required All"/>が含まれていても(理論上はContentPropertyAttributeのタイプが省略されている可能性があります)、それは役に立ちません。

私は、正確に何が起こっているかについて迷っています。しかし、その間に、ここに動作するあなたの方法のバージョンは次のとおりです。

static string GetContentProperty<TSource>() 
{ 
    return typeof(TSource).GetTypeInfo().CustomAttributes 
     .Where(a => a.AttributeType == typeof(ContentPropertyAttribute)) 
     .FirstOrDefault()?.NamedArguments.Cast<CustomAttributeNamedArgument?>() 
     .Where(n => n.Value.MemberName == "Name") 
     .FirstOrDefault()?.TypedValue.Value.ToString(); 
} 

(よりもむしろでTypeオブジェクトを渡し、私はちょうどそれが一般的な作られ、方法は、タイプを見つけることの仕事をしましょう。私は、列挙を具体化すること、その長さを検査し、それがだ場合、最初の要素を取得するよりも便利見つけるFirstOrDefault()を使用できるように上記において)

、Iはnull許容型にCustomAttributeNamedArgument値型を変換します空ではない。

GetCustomAttributes()方法は、まだ私はこれは何とかコンパイルUWPアセンブリが破棄が情報を入力することない何かに関係していると思いますしませんが、これはでも動作するという事実。しかし、残念ながら、UWPの特定の分野について、私はどのように言いたいのか分かりません。

私は、上記のことが非常に素晴らしい選択肢ではないことに同意するのは初めてです。属性自体ではなく属性の宣言情報を取得し、そのデータ内のプロパティ名を検索し、最後に型指定されていないvalueプロパティをデータからstringにキャストしなければならないため、返すことができます理想的ではありません。

しかし、それは動作します。それで、それがあります。 :)

私はタイトルにそれを置く
+0

この奇妙な行動のより良い理解。ありがとう、ピーター! – SuperJMN

関連する問題