Может быть, вы могли бы использовать следующий подход отражения.
Это класс, который содержит все соответствующие свойства и поля и их значения:
public class StringType
{
public StringType(IDictionary<MemberInfo, string> allPropertiesAndFields)
{
this.PropertiesAndFields = allPropertiesAndFields;
this.PropertyFieldNamesAndValues = allPropertiesAndFields.ToDictionary(m => m.Key.Name, m => m.Value);
}
private IDictionary<MemberInfo, string> PropertiesAndFields { get; set; }
private IDictionary<string, string> PropertyFieldNamesAndValues { get; set; }
public string GetValue(string propertyOrFieldName)
{
bool isKnown = PropertyFieldNamesAndValues.TryGetValue(propertyOrFieldName, out string value);
if (isKnown)
return value;
return null;
}
// if you want to know all informations about the property or field like type
public MemberInfo GetMemberInfo(string propertyOrFieldName)
{
MemberInfo memberInfo = PropertiesAndFields.Keys.FirstOrDefault(mi => mi.Name == propertyOrFieldName);
return memberInfo;
}
}
Теперь вам нужен метод преобразования:
public static StringType ConvertSomeClassToString(Object instance)
{
BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public; // maybe as parameter, cgange accordingly
Type t = instance.GetType();
PropertyInfo[] properties = t.GetProperties(bindingFlags);
FieldInfo[] fields = t.GetFields(bindingFlags);
var propertyMemberValues = properties.Select(p => new { Member = (MemberInfo) p, Value = p.GetValue(instance) });
var fieldMemberValues = fields.Select(f => new { Member = (MemberInfo) f, Value = f.GetValue(instance) });
Dictionary<MemberInfo, string> dict = propertyMemberValues
.Concat(fieldMemberValues)
.ToDictionary(m => m.Member, m => m.Value?.ToString());
return new StringType(dict);
}
Преобразует экземпляр любого типа в StringType
. Вот пример:
var list = new List<SomeClass>() { new SomeClass { Name = "foo", Cd = 4711 } };
Converter<Object, StringType> converter = ConvertSomeClassToString;
List<StringType> stringItemList = list.ConvertAll(converter);
StringType st = stringItemList.First();
string valueOfCD = st.GetValue("Cd"); // "4711"