C# 我如何在没有重复行的情况下生成代码? 公共类三 { ClassOne obj=null;//ClassOne:ClassThree ClassTwo obj2=null;//ClassTwo:ClassTwo 公共列表GetQueries(字符串源) { 列表查询=新建列表(); if(source.Equals(“ABCD”)) { obj=新的ClassOne(); addquery(查询,obj.GetQuery1()); addquery(查询,obj.GetQuery2()); addquery(查询,obj.GetQuery3()); addquery(查询,obj.GetQuery4()); addquery(查询,obj.GetQuery5()); addquery(查询,obj.GetQuery6()); } 其他的 { obj2=新的ClassTwo(); addquery(查询,obj2.GetQuery1()); addquery(查询,obj2.GetQuery2()); addquery(查询,obj2.GetQuery3()); addquery(查询,obj2.GetQuery4()); addquery(查询,obj2.GetQuery5()); addquery(查询,obj2.GetQuery6()); } 返回查询; } }

C# 我如何在没有重复行的情况下生成代码? 公共类三 { ClassOne obj=null;//ClassOne:ClassThree ClassTwo obj2=null;//ClassTwo:ClassTwo 公共列表GetQueries(字符串源) { 列表查询=新建列表(); if(source.Equals(“ABCD”)) { obj=新的ClassOne(); addquery(查询,obj.GetQuery1()); addquery(查询,obj.GetQuery2()); addquery(查询,obj.GetQuery3()); addquery(查询,obj.GetQuery4()); addquery(查询,obj.GetQuery5()); addquery(查询,obj.GetQuery6()); } 其他的 { obj2=新的ClassTwo(); addquery(查询,obj2.GetQuery1()); addquery(查询,obj2.GetQuery2()); addquery(查询,obj2.GetQuery3()); addquery(查询,obj2.GetQuery4()); addquery(查询,obj2.GetQuery5()); addquery(查询,obj2.GetQuery6()); } 返回查询; } },c#,.net,c#-4.0,C#,.net,C# 4.0,如何删除AddQuerie方法的重复。是否有可能编写一个方法,但它必须访问ClassOne或ClassTwo的相应对象 注意:ClassOne GetQueryX()与ClassII GetQueryX()不同 方法在不同的类之间是完全不同的 您可以使用add方法将GetQueryX()方法放在列表中(此代码不可避免地会有重复的结构),然后使用foreach循环将该列表中的每个条目添加到GetQueryX()中。这样,对于每个ClassOne和ClassTwo,只需调用一个addquery()方

如何删除AddQuerie方法的重复。是否有可能编写一个方法,但它必须访问ClassOne或ClassTwo的相应对象

注意:ClassOne GetQueryX()与ClassII GetQueryX()不同

方法在不同的类之间是完全不同的


您可以使用add方法将GetQueryX()方法放在列表中(此代码不可避免地会有重复的结构),然后使用foreach循环将该列表中的每个条目添加到GetQueryX()中。这样,对于每个ClassOne和ClassTwo,只需调用一个addquery()

方法1:使用接口

 Public Class ClassThree
   {
       ClassOne obj = null; //ClassOne:ClassThree
        ClassTwo obj2 = null; //ClassTwo:ClassThree
        public List<Query> GetQueries(string source)
        {
            List<Query> Queries = new List<Query>();
            if (source.Equals("ABCD"))
            {
                 obj = new ClassOne();
                AddQuerie(Queries, obj.GetQuery1());
                AddQuerie(Queries, obj.GetQuery2());
                AddQuerie(Queries, obj.GetQuery3());
                AddQuerie(Queries, obj.GetQuery4());
                AddQuerie(Queries, obj.GetQuery5());
                AddQuerie(Queries, obj.GetQuery6());             
            }
            else
            {
                obj2 = new ClassTwo();
                AddQuerie(Queries, obj2.GetQuery1());
                AddQuerie(Queries, obj2.GetQuery2());
                AddQuerie(Queries, obj2.GetQuery3());
                AddQuerie(Queries, obj2.GetQuery4());
                AddQuerie(Queries, obj2.GetQuery5());
                AddQuerie(Queries, obj2.GetQuery6());               
            }                
            return Queries;
        }
   } 
public interface IMultiQueryable
{
    string GetQuery1();
    string GetQuery2();
    string GetQuery3();
    string GetQuery4();
    string GetQuery5();
    string GetQuery6();
}

public class ClassOne : IMultiQueryable
{
    public string GetQuery1() => "";
    public string GetQuery2() => "";
    public string GetQuery3() => "";
    public string GetQuery4() => "";
    public string GetQuery5() => "";
    public string GetQuery6() => "";
}

public class ClassTwo : IMultiQueryable
{
    public string GetQuery1() => "";
    public string GetQuery2() => "";
    public string GetQuery3() => "";
    public string GetQuery4() => "";
    public string GetQuery5() => "";
    public string GetQuery6() => "";
}
用法

 Public Class ClassThree
   {
       ClassOne obj = null; //ClassOne:ClassThree
        ClassTwo obj2 = null; //ClassTwo:ClassThree
        public List<Query> GetQueries(string source)
        {
            List<Query> Queries = new List<Query>();
            if (source.Equals("ABCD"))
            {
                 obj = new ClassOne();
                AddQuerie(Queries, obj.GetQuery1());
                AddQuerie(Queries, obj.GetQuery2());
                AddQuerie(Queries, obj.GetQuery3());
                AddQuerie(Queries, obj.GetQuery4());
                AddQuerie(Queries, obj.GetQuery5());
                AddQuerie(Queries, obj.GetQuery6());             
            }
            else
            {
                obj2 = new ClassTwo();
                AddQuerie(Queries, obj2.GetQuery1());
                AddQuerie(Queries, obj2.GetQuery2());
                AddQuerie(Queries, obj2.GetQuery3());
                AddQuerie(Queries, obj2.GetQuery4());
                AddQuerie(Queries, obj2.GetQuery5());
                AddQuerie(Queries, obj2.GetQuery6());               
            }                
            return Queries;
        }
   } 
public interface IMultiQueryable
{
    string GetQuery1();
    string GetQuery2();
    string GetQuery3();
    string GetQuery4();
    string GetQuery5();
    string GetQuery6();
}

public class ClassOne : IMultiQueryable
{
    public string GetQuery1() => "";
    public string GetQuery2() => "";
    public string GetQuery3() => "";
    public string GetQuery4() => "";
    public string GetQuery5() => "";
    public string GetQuery6() => "";
}

public class ClassTwo : IMultiQueryable
{
    public string GetQuery1() => "";
    public string GetQuery2() => "";
    public string GetQuery3() => "";
    public string GetQuery4() => "";
    public string GetQuery5() => "";
    public string GetQuery6() => "";
}

有很多方法可以实现这一点,但我忍不住想知道,您提出的问题是否是由于之前的设计决策导致的

此外,您还有一条注释
ClassOne obj=null//ClassOne:ClassThree
这让我相信ClassOne和ClassThree继承自ClassThree?除了消除重复之外,如果你更详细地了解一下你想要完成的事情,这可能会有所帮助

如果ClassOne和ClassTwo继承自ClassThree,那么可以完全避免字符串切换

public class ClassThree
{
    public List<Query> GetQueries(string source)
    {
        List<Query> Queries = new List<Query>();
        dynamic obj = null;
        if (source.Equals("ABCD"))
        {
            obj = new ClassOne();            
        }
        else
        {
            obj = new ClassTwo();            
        }     
            
        AddQuerie(Queries, obj.GetQuery1());
        AddQuerie(Queries, obj.GetQuery2());
        AddQuerie(Queries, obj.GetQuery3());
        AddQuerie(Queries, obj.GetQuery4());
        AddQuerie(Queries, obj.GetQuery5());
        AddQuerie(Queries, obj.GetQuery6());            
        return Queries;
    }
} 
public List getquerys(字符串源)
{
列表查询=新建列表();
if(source.Equals(“ABCD”))
{
obj=新的ClassOne();
addquery(查询,GetQuery1());
addquery(查询,GetQuery2());
addquery(查询,GetQuery3());
addquery(查询,GetQuery4());
addquery(查询,GetQuery5());
addquery(查询,GetQuery6());
}
返回查询;
}
不过,除此之外,在内部,查询似乎应该简单地放在一个列表中,这样您就可以获得它们,而无需一次一个查询

public List<Query> GetQueries(string source)
{
    List<Query> Queries = new List<Query>();
    if (source.Equals("ABCD"))
    {
        obj = new ClassOne();
        AddQuerie(Queries, GetQuery1());
        AddQuerie(Queries, GetQuery2());
        AddQuerie(Queries, GetQuery3());
        AddQuerie(Queries, GetQuery4());
        AddQuerie(Queries, GetQuery5());
        AddQuerie(Queries, GetQuery6());
    }
    return Queries;
}

公共接口三类
{
List getquerys();
}
公共一级
{
私人名单查询;
公共列表查询
{
get=>查询;
私有集=>querys=value;
}
//…填充查询列表的方法
//如果需要,您甚至可以保留命名函数
公共查询GetQuery1()
{
返回查询[0];
}
}
或者更进一步,使用工厂类创建查询容器类,并完全跳过继承

注意:ClassOne GetQueryX()与ClassII GetQueryX()不同

方法在不同的类之间是完全不同的

在继承的类中,方法体是不同的。但他们必须有相同的签名。你是说他们的名字不一样吗


更多细节将有助于提供更好的解决方案。

解决此问题的最佳方法是让这两个类都实现
IGetQuery
接口,正如其他人所指出的那样

但是,如果您无法做到这一点,另一种方法是使用反射来调用所需的方法

假设您的
addquery()
方法所做的只是将
Query
添加到
List
中,您可以这样编写
getquerys()
方法:


    public interface ClassThree
    {
        List<Query> GetQueries();
    }

    public class ClassOne
    {
        private List<Query> queries;

        public List<Query> Queries
        {
            get => queries;
            private set => queries = value;
        }

        //...ways to populate the query list

        //You could even retain the named functions if needed
        public Query GetQuery1()
        {
            return queries[0];
        }
    }
public List getquerys(字符串源)
{
查询GetQuery(对象对象对象,int n)
{
var method=obj.GetType().GetMethod(“GetQuery”+n);
return(Query)method.Invoke(obj,null);
}
if(source.Equals(“ABCD”))
{
obj=新的ClassOne();
返回可枚举的.Range(1,6).Select(n=>GetQuery(obj,n)).ToList();
}
其他的
{
obj2=新的ClassTwo();
返回可枚举的.Range(1,6)。选择(n=>GetQuery(obj2,n)).ToList();
}
}

取决于
GetQuery1()
等的内容。这里可能会有很多优化。这些方法包含哪些内容?
ClassOne
ClassTwo
是否有公共接口或基类?他们可以吗?@jasparkent请现在检查编辑的代码,这些代码并不能真正回答问题。显然,方法主体是不同的,但签名是相同的。因此,将它们抽象为接口或基类的可能性是最大的。请检查,这个问题不完整,没有足够的答案。另外,对于要编码的工作代码,请考虑使用。不要使用<代码>动态< /代码>。在这种情况下,这并不能使事情变得更好:源代码看起来有点短,但您失去了对intellisence的支持,隐藏了编译器错误,并可能成为令人讨厌的运行时错误。