多类的重载扩展方法

时间:2018-10-23 18:36:19

标签: c# extension-methods overloading

在我的项目中,我有一个表示某种文档类型的类。每个类都有自己的属性和方法,尽管它们之间有一些相似之处。

我正在尝试为具有相同名称(方法重载)的每个类实现扩展方法,但是我收到了模棱两可的调用错误

代码以进一步解释

文档类型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 :(得分:1)

您正在创建的扩展方法不适用于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]限定符,扩展方法都将应用于该扩展方法,而不管其位于哪个类中。如果将每个扩展方法都保留在一个扩展程序中,则可能可以做您想做的事情不同的名称空间,仅在所需的特定文件中引用所需的名称空间,但我从未尝试过这样做,因此您的工作量可能会很大。

而且,正如其他人指出的那样,您的示例似乎不适合扩展方法的正常使用情况。因此,如果这确实是您的工作,则可能需要重做一些事情。

答案 1 :(得分:0)

您正在考虑扩展方法,就像它们是类方法一样。他们不是。

它们实际上是一堆静态方法的语法糖,因此编译器和Intellisense可以帮助您调用它们。

您必须具有要求参数类型为IEnumerable<XElement>的函数。难道编译器应该调用IEnumerable<XElement>吗?对于所有的过载检查目的,“ this”参数都将被忽略。之后,您将获得两个具有相同名称且具有任何参数类型的函数,以区分它们。

答案 2 :(得分:0)

我相信您的问题在这里:

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

在DocType_B和DocType_A中您有一个这样的方法...如果删除静态方法,它应该可以工作,但是我认为这不是可行的方法。