您好我正在尝试做的事情,我有一个类(EventType),它可以是动态的,并且在不同的时间有不同的成员/属性。
class EventType
{
int id{set;}
string name{set;}
DateTime date{set;}
List<int> list{set;}
Guid guid{set;}
}
在我的main方法中,我将此类上的实例传递给另一个类中的函数,并尝试使用反射来获取实例的属性,但它不成功并给我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);
}
}
答案 0 :(得分: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;}
}
或指定绑定闪存以获取非公共属性:
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
);
答案 1 :(得分:2)
Type.GetProperties会返回某个类型的公开属性。但是,由于您尚未指定属性的访问类型是否为私有。
您可以使用重载的Type.GetProperties(BindingFlags)方法获取所有属性,无论其访问修饰符如何。
答案 2 :(得分:1)
Type.GetProperties
会返回所有 public 属性,在您的课程中,它们都是私有的,因此不会返回。您可以将其公开,也可以使用BindingFlags
搜索私有,例如:
t.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance);
答案 3 :(得分: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);
}
}