4

こんにちは、これが私がやろうとしていることです。私は、動的になり、異なる時点で異なるメンバー/プロパティを持つことができるクラス (EventType) を持っています。

class EventType
{
    int id{set;}
    string name{set;}
    DateTime date{set;}
    List<int> list{set;}
    Guid guid{set;}
}

私のメインメソッドでは、このクラスのインスタンスを別のクラスの関数に渡し、リフレクションを試みてインスタンスのプロパティを取得しようとしていますが、成功せず、null 値が返されます。

class Program
{
    static void Main(string[] args)
    {
        EventType event1 = new EventType();
        int rate = 100;
        DataGenerator.Generate<EventType>(event1, rate);
    }
    public static byte[] test(EventType newEvent)
    {
        return new byte[1];
    }
}



static class DataGenerator
{
    public static void Generate<T>(T input, int eventRate, Func<T, byte[]> serializer=null)
    {            
        Type t = input.GetType();
        PropertyInfo[] properties = t.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine(property.ToString());   
        }
        var bytes = serializer(input);
    }
}
4

4 に答える 4

4

クラス プロパティはデフォルトでプライベートであり、GetPropertiesパブリック プロパティのみを返します。

プロパティを public として昇格するか:

class EventType
{
    public int id{set;}
    public string name{set;}
    public DateTime date{set;}
    public List<int> list{set;}
    public Guid guid{set;}
}

または、バインド flas を指定して非パブリック プロパティを取得します。

Type t = input.GetType();
PropertyInfo[] properties = t.GetProperties(
    BindingFlags.NonPublic | // Include protected and private properties
    BindingFlags.Public | // Also include public properties
    BindingFlags.Instance // Specify to retrieve non static properties
    );
于 2013-05-31T08:20:36.200 に答える
2

Type.GetPropertiesは、型のパブリックプロパティを返します。ただし、プロパティのアクセス タイプがprivateかどうかを指定していないためです。

オーバーロードされたType.GetProperties(BindingFlags)メソッドを使用して、アクセス修飾子に関係なく、すべてのプロパティを取得できます。

于 2013-05-31T08:21:05.607 に答える
1

Type.GetPropertiesすべてのパブリックプロパティを返します。クラスでは、それらはすべてプライベートであるため、返されません。それらを公開するかBindingFlags、非公開のものを検索するために使用することもできます。

t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
于 2013-05-31T08:25:07.067 に答える