2016-08-09 6 views
-3

組織のネストされたクラスを使用する次のデータ構造にいくつかの設定が保存されています。Reflectionを使用して入れ子クラスから静的プロパティを読み取る方法

public abstract class LogoSpec 
{ 
    public abstract byte[] Logo { get; set; } 

    public class Web 
    { 
     public static float Height { get; set; } 

     public class A4 : Web 
     { 
      public static float Left { get; set; } 
     } 
    } 
} 

public class SampleLogo : LogoSpec 
{ 
    public override byte[] Logo { get; set; } 
} 
私は正確に

// Setting values 
SampleLogo.Web.A4.Height = 10.25f; 

がどのように私は、実行時にこの値を取得する関数を書くことができ、設計時に使用するためにどのような価値を知っているとき

私は簡単にそれを使用することができますか?

float GetValue(string logoName = "SampleLogo", string layout = "Web", string paperSize = "A4", string property = "Height"); 
+2

すでにこれらの値をリフレクションで取得しようとしましたか?もしそうなら、あなたはどんな特定の問題に遭遇しましたか?もしそうでなければ、それを行ってください。 – csmckelvey

+0

疑問の恩恵を与えて、私はあなたのシナリオに対する答えをWebとStack Overflowですでに検索していて、あなたの目標を達成するためのコードを実装しようとしましたが、何らかの理由でそれを取得できなかったと仮定します働くこれらの寛大な前提をすべてとっても、私は、上記のすべてのことを示す良い[mcve]と、あなたが苦しんでいる特定の難易度の説明を欠いているので、上記の必要性の問題はまだ働いていることがわかります。 –

+0

試行されたGetNestedTypes()が基本型から来た場合は入れ子型を返しません。私はReflectionから何が使えるのか分からない。 – Raj

答えて

1

そのプロパティを取得する方法は非常にまっすぐ進む実際にあるが、あなたはすべての必要なBindingFlags提供する必要があります。

PropertyInfo p = typeof(SampleLogo.Web.A4).GetProperty("Height", 
    BindingFlags.Static | 
    BindingFlags.FlattenHierarchy | 
    BindingFlags.Public); 

FlattenHierarchyは、ベースクラスのプロパティを取得するために必要とされます。

今、あなたが値を取得および設定するために、このPropertyInfoを使用することができます。

p.SetValue(null, 14f); 
float height = (float)p.GetValue(null); 

更新:完全な方法は、次のようになります。

public float GetValue(string logoName = "LogoSpec", string layout = "Web", string paperSize = "A4", string property = "Height") 
{ 
    Type logoType = Type.GetType(logoName); 
    Type layoutType = logoType?.GetNestedType(layout); 
    Type paperType = layoutType?.GetNestedType(paperSize); 
    PropertyInfo pi = paperType?.GetProperty("Height", BindingFlags.Static | BindingFlags.FlattenHierarchy | BindingFlags.Public); 
    return (float?)pi?.GetValue(null) ?? 0f; 
} 

しかし"LogoSpec"のための代わりの点に注意してくださいAssemblyQualifiedNameを使用するか、少なくともその名前空間で型名を修飾する必要があります。

+0

ありがとうございます。私が使っていなかったのはFlattenHierarchyでした。 – Raj

+0

@ Raj Ok、とにかくこのメソッドを追加しました。これがどのように機能するのか私は不思議でした。 –

関連する問題