Использование отражения обычным способом не будет работать, поскольку члены структуры ref не могут быть упакованы (превращены в System.Object).
Код: Выделить всё
Match match = new Regex("\\d+").Match("testing 123"); // Create test data
PropertyInfo[] props = match.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
var values = props.Select(s => (s.Name, s.GetValue(match, null))).ToArray();
Я пытаюсь создать инспектор объектов, который может просматривать поля и свойства объектов. В идеале должен быть способ вызвать метод, который принимает проверяемый объект (в нашем случае Match), имя строкового свойства (в нашем случае "ValueSpan") и тип возвращаемого значения (в нашем случае typeof(ReadOnlySpan)).
Что-то вроде этого:
Код: Выделить всё
Match match = new Regex("\\d+").Match("testing 123"); // Create test data
var result = GetProperty(match, "ValueSpan", typeof(ReadOnlySpan))
Я уже пытался решить эту проблему разными способами, наиболее многообещающим из которых было использование деревьев выражений. Следующий метод принимает проверяемый объект и имя свойства в качестве параметров, но требует знания типа возвращаемого значения:
Код: Выделить всё
public static T GetProperty(object target, string name) where T : allows ref struct
{
var arg = Expression.Parameter(typeof(object));
var expr = Expression.Property(Expression.Convert(arg, target.GetType()), name);
var compiled = Expression.Lambda(expr, arg).Compile();
return compiled(target);
}
Код: Выделить всё
Match match = new Regex("\\d+").Match("testing 123"); // Create test data
var result = GetProperty(match, "ValueSpan")
Даже хакерские способы приветствуются. Я думал о чем-то вроде создания поддельной структуры «базового типа» и копирования данных с помощью указателей, включая RuntimeHandle. Некоторые сведения о том, как нам нужно создать тип, который может быть заменителем любого типа, включая ссылочные структуры. Мысли по этому поводу?
Подробнее здесь: https://stackoverflow.com/questions/799 ... reflection
Мобильная версия