Как вы расширяете (или МОЖЕТЕ ли вы расширять) статические математические методы? - PullRequest
10 голосов
/ 27 января 2009

С C # 3.0 я знаю, что вы можете расширять методы, используя номенклатуру 'this'.

Я пытаюсь расширить Math.Cos (двойные радианы), чтобы включить мой новый класс. Я знаю, что могу просто создать метод «Cos» в моем существующем классе, но мне просто интересно посмотреть, как / если это можно сделать ради упражнения.

Попробовав несколько новых вещей, я возвращаюсь к SO, чтобы получить информацию. Я застрял.

Вот что у меня есть на данный момент ...

public class EngMath
{
    /// ---------------------------------------------------------------------------
    /// Extend the Math Library to include EngVar objects.
    /// ---------------------------------------------------------------------------

    public static EngVar Abs(this Math m, EngVar A)
    {
        EngVar C = A.Clone();

        C.CoreValue = Math.Abs(C.CoreValue);

        return C;
    }

    public static EngVar Cos(this Math m, EngVar A)
    {
        EngVar C = A.Clone();
        double Conversion = 1;
        // just modify the value. Don't modify the exponents at all

        // is A degrees? If so, convert to radians.
        if (A.isDegrees) Conversion = 180 / Math.PI;

        C.CoreValue = Math.Cos(A.CoreValue * Conversion);

        // if A is degrees, convert BACK to degrees.
        C.CoreValue *= Conversion;

        return C;
    }

    ...

1 Ответ

12 голосов
/ 27 января 2009

Методы расширения - это способ сделать ваши статические методы похожими на методы экземпляров того типа, который они «расширяют». Другими словами, вам нужен экземпляр чего-либо, чтобы использовать функцию метода расширения.

Мне кажется, что вы делаете это противоположным образом, пытаясь заставить Math.Cos обрабатывать ваш тип. В этом случае, я боюсь, что вы должны реализовать эту функцию самостоятельно. Если это не то, что вы пытаетесь сделать, пожалуйста, уточните.

...