4

嗨,这是我想做的,我有一个类(EventType),它可以是动态的,并且在不同的时间有不同的成员/属性。

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

在我的主要方法中,我将此类上的实例传递给不同类中的函数并尝试反射以获取实例的属性,但它不成功并给我空值。

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只返回公共属性。

要么将您的财产宣传为公开:

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 回答
1
class EventType
{
    int id { get; set; }
    string name { get; set; }
    DateTime date { get;  set; }
    List<int> list { get; set; }
    Guid guid { get; set; }
}

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(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
        foreach (PropertyInfo property in properties)
        {
            Console.WriteLine(property.ToString());
        }
        //var bytes = serializer(input);
    }
}
于 2013-05-31T09:34:31.733 回答