Я столкнулся с проблемой, которую не могу решить.У меня есть IReadOnlyList
классов, каждый из которых имеет несколько полей.Эти поля имеют имена (имена переменных), идентичные списку перечислений.Подумайте, что для каждого существующего поля также существует перечисление для него с точно таким же именем (поэтому object helloHi
имеет эквивалент enum something { helloHi }
).
Я пытался сравнить два поляимена.Если они идентичны, выполните для них функцию.Проблема заключается в том, что функция должна вывести T
из переменной, и поскольку рефлексия не может извлечь это 'T' без какой-либо формы приведения, она не будет продолжена.
Этокод:
public class Something() {
[BackgroundTask]
private void load(Overlay param_1, Config param_2) {
Children = new Drawable[] // is the IReadOnlyList
{
SomethingClass(param_1),
AnotherClass(param_2)
}
performTask(this, param_2);
}
}
public class Config {
public void task<U>(SomeEnums se, ValueType<U> value) // do the task
}
public class SomethingClass {
ValueType<double> someDouble = new ValueType<double>();
ValueType<int> someInt = new ValueType<int>();
public SomethingClass(Overlay overlay) //...
}
public enum SomeEnums {
someDouble,
someInt,
}
void performTask(Something the_class, Config the_config) {
// ... for each field within the_class, do (uses reflection)
field => {
foreach (SomeEnums enums in Enum.GetValues(typeof(SomeEnums)))
{
if (field.Name == enums.ToString()) {
the_config.task(enums, field.GetValue(null)); // cant infer 'U' from an 'object'
}
}
}
}
Технически, я мог бы просто сделать config.task
в классе, где типы известны и видимы, но я бы предпочел автоматизировать его отсюда, чтобы он неКаждый раз, когда создается новая переменная, требуется 2-3 изменения.
Одна из известных мне стратегий заключается в выполнении проверки if
в performTask
, например:
// performTask, field =>, foreach
{
if (field.FieldType == ValueType<double>)
config.task(enums, (ValueType<double>)field.GetValue(null));
} //etc
Однако мне не нравится этот метод.Просто нужно будет вводить все больше и больше проверок, если я когда-либо создаю больше ValueType<>
и если они еще не проверяются.Будет ли лучший способ выполнить то, что я хочу?