如何将2种方法与不同的对象组合在一起(两种方法中的代码相同)

问题描述 投票:0回答:2

这里是新海报,但是已经使用SO很长时间了。

我对C#编码有点不满意,我想对自己的代码进行优化。我有两种方法,它们的代码完全相同,但是对象不同(该对象具有一些不同的属性,但是两种方法中使用的属性相同)。在调用该方法之前,查询的构建方式有所不同。有没有一种方法可以轻松地组合这些方法,以便我仍然可以将其与一个或另一个对象一起使用?

private static void SetQueryMainFilters(DocumentQueryObject documentQuery, DocumentQuery repeaterQuery, out DocumentQuery outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}

private static void SetQueryMainFilters(DocumentQueryObject documentQuery, MultiDocumentQuery repeaterQuery, out MultiDocumentQuery outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}

一种调用重复方法的方法

public static MultiDocumentQuery RepeaterMultiDocumentQuery(DocumentQueryObject documentQuery)
{
    MultiDocumentQuery repeaterQuery = new MultiDocumentQuery();
    [...]
    SetQueryMainFilters(documentQuery, repeaterQuery, out repeaterQuery);

    return repeaterQuery;
}

目前,我有一个MultiDocumentQuery对象和一个DocumentQueryObject。两种方法中的代码相同,但是对象不同。

是否有适当的方法可以避免代码重复?如果您有更好的解决方案可以提供给我,我会征询您的意见。我需要能够调用具有几乎相同的属性但行为不同的多重查询构建器或常规查询构建器。它使用Kentico的DocumentQuery和MultiDocumentQuery。

谢谢!

c# asp.net kentico
2个回答
1
投票

您可以声明将继承DocumentQueryMultiDocumentQuery的基类,并且该基类应包含WhereEquals()方法。

public class DocumentBase
{
    public void WhereEquals() { }
}

public class DocumentQuery : DocumentBase
{
    // Other stuff
}

public class MultiDocumentQuery : DocumentBase
{
    // Other stuff
}

public class DocumentQueryObject
{
    public int NodeID { get; set; }
    public int DocumentID { get; set; }
}

然后,您可以像这样统一两种方法:

private static void SetQueryMainFilters(
    DocumentQueryObject documentQuery, 
    DocumentBase repeaterQuery, 
    out DocumentBase outRepeaterQuery)
{
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals();
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals();
    }

    outRepeaterQuery = repeaterQuery;
}

这意味着,在调用它时,您必须创建一个基类的对象,但是new使用的是适当的类型。

DocumentBase single = new DocumentQuery();
SetQueryMainFilters(documentQuery, single, out single);
DocumentBase multi = new MultiDocumentQuery();
SetQueryMainFilters(documentQuery, multi, out multi);

1
投票
private static void SetQueryMainFilters<TQuery>(DocumentQueryObject documentQuery, TQuery repeaterQuery, out TQuery outRepeaterQuery) where TQuery : DataQueryBase<TQuery>, new()
{ 
    if (documentQuery.NodeID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.NODE_ID, documentQuery.NodeID);
    }

    if (documentQuery.DocumentID > 0)
    {
        repeaterQuery.WhereEquals(KenticoConstants.DOCUMENT_ID, documentQuery.DocumentID);
    }

    outRepeaterQuery = repeaterQuery;
}
© www.soinside.com 2019 - 2024. All rights reserved.