Статические методы вызываемые через generic класса

Для создания каждого типа класса, мне нужно некое предварительное условие их создания для визуализации, которое я записал в статическом методе.

public abstract class ClassBase {

    public static double ValueModifier (double value) {
        return value;
    }
}

public class ClassChildA : ClassBase {

    public new static double ValueModifier (double value) { 
        return Math.Sign(value)*10; 
    }
}

public class ClassChildB : ClassBase {

    public new static double ValueModifier (double value) { 
        return Math.Round(value/0.5)*0.5; 
    }
}

public class Printer<T> where T : ClassBase {

    public double Print (double value) {
        // T' is a type parameter, which is not valid in the given context
        return T.ValueModifier(value); 
        // 'Type' does not contain a definition for 'ValueModifier' and no accessible extension method 'ValueModifier' accepting a first argument of type 'Type' could be found (are you missing a using directive or an assembly reference?)
        return typeof(T).ValueModifier(value); 
    }
}

Как нужно написать метод Print?

Или лучше описывать эти условия в отдельных классах для каждого типа ClassChild?


Ответы (1 шт):

Автор решения: aepot

Вот так получается, только через рефлексию.

public double Print(double value)
{
    return (double)typeof(T).GetMethod("ValueModifier").Invoke(null, new object[] { value });
}

Попробуем

static void Main(string[] args)
{
    Console.WriteLine(new Printer<ClassChildA>().Print(-20.0));
    Console.ReadKey();
}

Вывод

-10
→ Ссылка