Использование рефлексии для вложенного класса - C#
Формулировка задачи:
Здравствуйте. Вопрос такой.
Есть класс, например, public class Class1
в нем куча полей и свойств простых типов (риал, инт, стринг и тд)
и есть поля и свойства типа Class2 (который может состоять как из простых типов, так и из классов)
Нужны методы для получения всех имен свойств (если свойство является классом то необходимо вызывать рефлексию для него, и получить свойства из которых состоит этот класс) и для получения всех значений.
Для получения имен я написал метод:
Правда, очень страшно выглядит, как бы сделать покрасивее? и избавится от константы? она все портит(((
Для получения значений:
Тут не могу додумать, а как вызывать функцию для вложенного класса (как в примере с получением имен)
В методе выше я передавал тип, а тут нужно передавать объект. как это сделать?
Извиняюсь за глупый вопрос.
Помогите, пожалуйста(((
public static void GetNamesOfClassProps1(Type clType, out string[] names)
{
PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
int i = 0;
string []names1 = new string[getsProp.Length];
Type[] types = new Type[getsProp.Length];
// Как избавится от константы в строчке ниже?
string[] names2 = new string[2];
string[] temp = new string[getsProp.Length+ names2.Length];
foreach (PropertyInfo propInfo in getsProp)
{
names1[i] = propInfo.Name;
types[i] = propInfo.PropertyType;
if (types[i].IsClass == true)
{
GetNamesOfClassProps1(types[i], out names2);
}
i += 1;
}
for (int j = 0; j < names1.Length; j++)
temp[j] = names1[j];
for (int j = 0; j < names2.Length; j++)
{
if (names2[j] != null)
temp[j + names1.Length] = names2[j];
}
names = temp;
}public static void ReadFromClassProps(object elClass, out object[] readed)
{
Type clType = elClass.GetType();
PropertyInfo[] getsProp = clType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
readed = new object[getsProp.Length];
int i = 0;
foreach (PropertyInfo propInfo in getsProp)
{
if (propInfo.CanRead)
{
readed[i] = propInfo.GetValue(elClass);
}
i += 1;
}
}Решение задачи: «Использование рефлексии для вложенного класса»
textual
Листинг программы
class Class1
{
public int Prop1 { get; set; } = 1;
public byte Prop2 { get; set; } = 2;
public long Prop3 { get; set; } = 3;
public float Prop4 { get; set; } = 4.5f;
public Class2 Prop5 { get; set; } = new Class2();
public string Prop6 { get; set; } = "1234";
public List<string> GetPropertyNames()
{
List<string> result = new List<string>();
result.AddRange(GetPropertyNames(GetType()));
return result;
}
public List<string> GetPropertyNames(Type type)
{
List<string> result = new List<string>();
PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach(var prop in properties)
{
result.Add(prop.Name);
if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
{
foreach(var prop2 in GetPropertyNames(prop.PropertyType))
{
result.Add(prop.Name + "." + prop2);
}
}
}
return result;
}
public List<object> GetPropertyValues()
{
List<object> result = new List<object>();
result.AddRange(GetPropertyValues(GetType(), this));
return result;
}
public List<object> GetPropertyValues(Type type, object obj)
{
List<object> result = new List<object>();
PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var prop in properties)
{
var obj2 = prop.GetValue(obj);
result.Add(obj2);
if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
{
foreach (var prop2 in GetPropertyValues(prop.PropertyType, obj2))
{
result.Add(prop2);
}
}
}
return result;
}
public Dictionary<string, object> GetPropertyNamesAndValues()
{
Dictionary<string, object> result = new Dictionary<string, object>();
foreach (var kv in GetPropertyNamesAndValues(GetType(), this))
result.Add(kv.Key, kv.Value);
return result;
}
public Dictionary<string, object> GetPropertyNamesAndValues(Type type, object obj)
{
Dictionary<string, object> result = new Dictionary<string, object>();
PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
foreach (var prop in properties)
{
var obj2 = prop.GetValue(obj);
result.Add(prop.Name, obj2);
if (prop.PropertyType.IsClass && prop.PropertyType != typeof(string))
foreach (var prop2 in GetPropertyNamesAndValues(prop.PropertyType, obj2))
result.Add(prop.Name + "." + prop2.Key, prop2.Value);
}
return result;
}
public void Print()
{
//foreach(var prop in GetPropertyNames())
//{
// Console.WriteLine(prop);
//}
//foreach (var val in GetPropertyValues())
//{
// Console.WriteLine(val);
//}
foreach (var prop in GetPropertyNamesAndValues())
{
Console.WriteLine(prop.Key + ": " + prop.Value);
}
}
}
class Class2
{
public int Prop1 { get; set; } = 6;
public byte Prop2 { get; set; } = 7;
public long Prop3 { get; set; } = 8;
public float Prop4 { get; set; } = 9;
public Class3 Prop5 { get; set; } = new Class3();
public string Prop6 { get; set; } = "458enb57enb5e";
}
class Class3
{
public int Prop1 { get; set; }
public byte Prop2 { get; set; }
public long Prop3 { get; set; }
public float Prop4 { get; set; }
public string Prop6 { get; set; }
}