126

これはかなり基本的なようですが、機能させることはできません。オブジェクトがあり、リフレクションを使用してそのパブリック プロパティにアクセスしています。これらのプロパティの 1 つは静的であり、私はそれにたどり着くことができません。

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName)

End Function

上記のコードは、パブリック インスタンス プロパティに対しては正常に機能します。これまでのところ、これだけで十分です。BindingFlags を使用して他のタイプのプロパティ (プライベート、静的) を要求できると思われますが、適切な組み合わせが見つからないようです。

Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
    Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)

End Function

それでも、静的メンバーを要求しても何も返されません。.NET リフレクターは静的プロパティを問題なく認識できるため、明らかに何かが欠けています。

4

8 に答える 8

153

それともこれだけ見て...

Type type = typeof(MyClass); // MyClass is static class with static properties
foreach (var p in type.GetProperties())
{
   var v = p.GetValue(null, null); // static classes cannot be instanced, so use null...
}
于 2010-08-02T10:27:00.363 に答える
47

これは C# ですが、アイデアが得られるはずです。

public static void Main() {
    typeof(Program).GetProperty("GetMe", BindingFlags.NonPublic | BindingFlags.Static);
}

private static int GetMe {
    get { return 0; }
}

(NonPublic と Static のみを OR する必要があります)

于 2009-01-16T18:35:08.720 に答える
46

少し透明感...

// Get a PropertyInfo of specific property type(T).GetProperty(....)
PropertyInfo propertyInfo;
propertyInfo = typeof(TypeWithTheStaticProperty)
    .GetProperty("NameOfStaticProperty", BindingFlags.Public | BindingFlags.Static); 

// Use the PropertyInfo to retrieve the value from the type by not passing in an instance
object value = propertyInfo.GetValue(null, null);

// Cast the value to the desired type
ExpectedType typedValue = (ExpectedType) value;
于 2012-07-17T20:27:23.113 に答える
29

わかりましたので、私にとって重要なのは、.FlattenHierarchy BindingFlag を使用することでした。直感で追加しただけで、機能し始めた理由がよくわかりません。したがって、パブリック インスタンスまたは静的プロパティを取得できる最終的な解決策は次のとおりです。

obj.GetType.GetProperty(propName, Reflection.BindingFlags.Public _
  Or Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or _
  Reflection.BindingFlags.FlattenHierarchy)
于 2009-01-19T14:22:55.260 に答える
8
myType.GetProperties(BindingFlags.Public | BindingFlags.Static |  BindingFlags.FlattenHierarchy);

これにより、静的基本クラスまたは特定の型のすべての静的プロパティが返され、おそらく子も返されます。

于 2011-06-28T18:40:00.230 に答える
3

TypeInfo- whereBindingFlagsが確実に利用できない場合 (ターゲット フレームワークによっては) に基づく新しいリフレクション API を使用しながら、自分自身でこれを明確にしたかっただけです。

「新しい」リフレクションで、型 (基本クラスを含まない) の静的プロパティを取得するには、次のようにする必要があります。

IEnumerable<PropertyInfo> props = 
  type.GetTypeInfo().DeclaredProperties.Where(p => 
    (p.GetMethod != null && p.GetMethod.IsStatic) ||
    (p.SetMethod != null && p.SetMethod.IsStatic));

読み取り専用または書き込み専用のプロパティの両方に対応します (書き込み専用はひどい考えですが)。

DeclaredPropertiesメンバーも、パブリック/プライベート アクセサーを持つプロパティを区別しません。そのため、可視性をフィルタリングするには、使用する必要があるアクセサーに基づいてそれを行う必要があります。例-上記の呼び出しが返されたと仮定すると、次のことができます。

var publicStaticReadable = props.Where(p => p.GetMethod != null && p.GetMethod.IsPublic);

TypeInfo利用可能なショートカット メソッドがいくつかありますが、最終的には、クエリ メソッド/プロパティに関するさらに多くの拡張メソッドを作成する予定です。また、新しい API では、個々のアクセサーに基づいて自分自身をフィルター処理する必要があるため、今後は「プライベート」または「パブリック」プロパティと見なすものを正確に考える必要があります。

于 2015-08-21T14:46:39.877 に答える
1

以下は私のために働くようです。

using System;
using System.Reflection;

public class ReflectStatic
{
    private static int SomeNumber {get; set;}
    public static object SomeReference {get; set;}
    static ReflectStatic()
    {
        SomeReference = new object();
        Console.WriteLine(SomeReference.GetHashCode());
    }
}

public class Program
{
    public static void Main()
    {
        var rs = new ReflectStatic();
        var pi = rs.GetType().GetProperty("SomeReference",  BindingFlags.Static | BindingFlags.Public);
        if(pi == null) { Console.WriteLine("Null!"); Environment.Exit(0);}
        Console.WriteLine(pi.GetValue(rs, null).GetHashCode());


    }
}
于 2009-01-16T18:45:36.547 に答える
-3

このC#リフレクションリンクを試してください。

BindingFlags.InstanceとBindingFlags.Staticは排他的だと思います。

于 2009-01-16T18:39:38.417 に答える