Метод расширения перегрузки для нескольких классов - PullRequest
0 голосов
/ 23 октября 2018

В моем проекте у меня есть класс, который представляет определенный тип документа.Каждый класс имеет свои собственные свойства и методы, хотя между ними есть некоторые сходства.

Я пытаюсь реализовать метод расширения для каждого класса с тем же именем ( перегрузка метода ), но яполучаю неоднозначную ошибку при вызове

Код для дальнейшего объяснения

Представление класса типа A документа:

static class DocType_A
{
    private static XElement baseDocType_A = XmlFiles[0].Root;

    // Extension Method
    internal static IEnumerable<ViewData> AsViewData(this IEnumerable<XElement> result)
    {
        return
            from doc in result select new ViewData { };
    }


    // Contains methods for querying through the XML file of this [DocType_A] type
    internal static class Query
    {
        internal static IEnumerable<XElement> ByStatusOrAny(byte status = 0)
        {
            return baseDocType_A.Descendants("DocType_A").Select(doc => doc);
        }

        internal static IEnumerable<XElement> Expired()
        {
            return baseDocType_A.Descendants("DocType_A").Where("some conditions").Select(doc => doc);
        }

    }

    // Represents the data needed to be displayed to the user via the DGV
    internal class ViewData
    {
        // [DocType_A] related Property 
    }

    internal class Counter
    {
        // some property
    }

}

Представление класса типа B документа:

static class DocType_B
{
    private static XElement baseDocType_B = XmlFiles[1].Root;

    // Extension Method
    internal static IEnumerable<ViewData> AsViewData(this IEnumerable<XElement> result)
    {
        return
            from doc in result select new ViewData { };
    }


    // Contains methods for querying through the XML file of this [DocType_A] type
    internal static class Query
    {
        internal static IEnumerable<XElement> ByStatusOrAny(byte status = 0)
        {
            return baseDocType_B.Descendants("DocType_B").Select(doc => doc);
        }

        internal static IEnumerable<XElement> Expired()
        {
            return baseDocType_B.Descendants("DocType_B").Where("some conditions").Select(doc => doc);
        }

    }

    // Represents the data needed to be displayed to the user via the DGV
    internal class ViewData
    {
        // [DocType_B] related Property 
    }

    internal class Counter
    {
        // some property
    }
}

Использование:

class SomeApplicationClass
{
    void Method()
    {
        IEnumerable<DocType_A.ViewData> query = DocType_A.Query.ByStatusOrAny().AsViewData();
    }

    void SomeOtherMethod()
    {
        IEnumerable<DocType_B.ViewData> query = DocType_B.Query.ByStatusOrAny().AsViewData();
    }
}

Но я получаю неоднозначную ошибку вызова.

Возможно ли создать метод расширения для каждого класса с одинаковым именем?

error

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я полагаю, что ваша проблема здесь:

internal static IEnumerable<ViewData> AsViewData(this IEnumerable<XElement> result)

У вас есть один подобный метод в DocType_B и DocType_A ... если вы удалите static, он должен работать, но я не думаю, что этопуть.

0 голосов
/ 23 октября 2018

Методы расширения, которые вы создаете, не для Doctype_A или Doctype_B, вы создаете их для IEnumerable .Таким образом, на самом деле у вас есть два метода расширения с одной и той же сигнатурой.

Если вам нужен один специфический для A или B, вы должны сделать это так

    internal static IEnumerable<XElement> ByStatusOrAny(this DocType_A doc, byte status = 0)
    {
        return doc.Query.Descendants("DocType_A").Select(doc => doc);
    }

, а затем вызвать его как

    DocType_A.ByStatusOrAny().AsViewData();

Я знаю, вы хотите, чтобы он был ограничен, но это не так.Независимо от того, к какому классу он будет применен, независимо от того, к какому классу он применяется, независимо от того, к какому классу он относится, можно использовать [this].пространство имен и ссылаются только на пространство имен, которое вы хотите в определенных файлах, которые вы хотите, но я никогда не пробовал это, поэтому ваш пробег может быть очень.

Кроме того, как уже отмечали другие, ваш пример, кажется, несоответствовать нормальному варианту использования для методов расширения.Поэтому, если вы действительно этим занимаетесь, возможно, вы захотите что-то переделать.

0 голосов
/ 23 октября 2018

Вы думаете о методах расширения, как если бы они были классовыми методами.Это не так.

На самом деле это синтаксический сахар для нескольких статических методов, поэтому компилятор и Intellisense могут помочь вам вызвать их.

Вам нужны функции, для которых требуется параметрвведите IEnumerable<XElement>.Какой компилятор должен вызывать IEnumerable<XElement>?Для всех целей проверки перегрузки параметры "this" игнорируются.После этого у вас есть две функции с одним и тем же именем и с любыми типами параметров для дифференциации.

...