Получение PropertyInfo.Name из объекта FieldInfo
У меня есть метод, который использует некоторые объекты FieldInfo:
public static T SetFieldValue<T>(this T src, string propName, object value)
{
Type type = typeof(T);
FieldInfo propInfo = type.GetField(propName,
BindingFlags.Instance | BindingFlags.NonPublic);
Type propType = propInfo.FieldType;
var targetType = IsNullableType(propType)
? Nullable.GetUnderlyingType(propType) : propType;
value = Convert.ChangeType(value, targetType);
propInfo.SetValue(src, value);
return src;
}
Теперь мне нужен какой-то способ получения объекта PropertyInfo из определенного FieldInfo, который возвращает эта функция, главным образом потому, что мне конкретно нужна строка PropertyInfo.Name, есть мысли по этому поводу?
Изменить: Вот более конкретный код, я использую этот метод, чтобы получить разницу между двумя объектами:
public static List<Variance> DetailedCompare<T>(this T val1, T val2)
{
List<Variance> variances = new List<Variance>();
FieldInfo[] fi = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo f in fi) {
Variance v = new Variance();
v.Prop = f.Name;
v.valA = f.GetValue(val1);
v.valB = f.GetValue(val2);
if (v.valA != null) {
if (!v.valA.Equals(v.valB))
variances.Add(v);
} else if (v.valB != null) {
variances.Add(v);
}
}
return variances;
}
Затем я использую возвращенные поля для форматирования запроса SQL, который я отправлю веб-службе, чтобы быть более конкретным. Но объекты FieldInfo.Name обычно являются чем-то вроде k__BackingField или k__BackingField. Мне нужно PropertyInfo.Name, которое является правильным именем. Есть ли способ создать объект PropertyInfo из объекта FieldInfo?
2 ответа
Я пробился вокруг этого:
public static List<Variance> DetailedCompare<T>(this T val1, T val2, bool pName = false)
{
List<Variance> variances = new List<Variance>();
FieldInfo[] fi = typeof(T).GetFields(BindingFlags.Instance | BindingFlags.NonPublic);
foreach (FieldInfo f in fi) {
Variance v = new Variance();
PropertyInfo prop = default(PropertyInfo);
if (pName) {
prop = typeof(T).GetProperties().Where(p => f.Name.Contains(p.Name)).FirstOrDefault();
}
v.Prop = pName ? (prop != default(PropertyInfo) ? prop.Name : "") : f.Name;
v.valA = f.GetValue(val1);
v.valB = f.GetValue(val2);
if (v.valA != null) {
if (!v.valA.Equals(v.valB))
variances.Add(v);
} else if (v.valB != null) {
variances.Add(v);
}
}
return variances;
}
Что я сделал, так это дал возможность этому методу вернуть PropertyInfo.Name.
Я получил это в моих старых кодах.
private static PropertyInfo GetInfo(object myObject, string name)
{
return myObject.GetType().GetProperty(name);
}
Вы можете использовать PropertyInfo
msdn https://docs.microsoft.com/en-us/dotnet/api/system.reflection.propertyinfo?view=netframework-4.7.2
и если вы хотите получить все члены в T
Type type = typeof(T);
MemberInfo[] tempInfo = type.GetMembers();
MemberInfo https://docs.microsoft.com/en-us/dotnet/api/system.reflection.memberinfo?view=netframework-4.7.2