В .net Core есть перегрузки и методы в объекте Type , чтобы вы могли иметь возможность напрямую получить метод. Использование type.makegenericmethodparameter () для создания типов заполнителей, чтобы позволить вам заменить параметры метода и methodinfo.getmethod () на перегрузки, чтобы указать количество общих параметров в методе.
Код: Выделить всё
// very simplified
public string CallToString(object value)
{
var type = value.GetType();
if (!type.IsGenericType)
return ToString(value);
var method = GetType().GetMethod("ToString", 1, // `1` indicates how many generic parameters the method would have
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance,
new[] { Type.MakeGenericMethodParameter(0) } // use placeholder type for the generic parameter
);
if (method != null)
return (string)method.MakeGenericMethod(type).Invoke(this, [value])!;
return ToString(value);
}
private string ToString(object arg)
{
return $"ToString(object)";
}
private string ToString(T arg)
{
return $"ToString({typeof(T).Name})";
}
Однако я работаю с приложением .NET Framework и не имеет ни метода Type.makegenericMethodParameter () для создания заполнителя, ни методикфо.getmethod () перегрузка для общего количества параметров. Я мог бы выполнить поиск вручную, вызывая type.getMethods () и поиск метода, который я ищу (что я делаю), но, конечно, прямой подход существует правильно? Если бы я хотел, я, вероятно, мог бы даже пойти по маршруту использования Dynamic , чтобы компилятор выяснил его, но я бы предпочел не открывать, что для этого может быть червей.>
Подробнее здесь:
https://stackoverflow.com/questions/797 ... c-method-d