C# 返回';这';在C中#

C# 返回';这';在C中#,c#,generics,C#,Generics,我有一个包含类的库。这门课是要延长的。它将连接到数据库并生成扩展它的类的条目。现在我想返回一个扩展类类型的数组。我该怎么做?例如: public this[] search(string search) { } 我怎样才能做到这一点 编辑: 我在使用泛型,它是一个泛型类。这意味着我对扩展我的类没有任何线索。所以不,我不能只在[]之前添加类名 编辑2: 正如已经指出的,返回这个数组没有任何意义(那是我的错误)。所以我要做的是返回一个扩展类类型的数组。 例如: public abstract cl

我有一个包含类的库。这门课是要延长的。它将连接到数据库并生成扩展它的类的条目。现在我想返回一个扩展类类型的数组。我该怎么做?例如:

public this[] search(string search) {
}
我怎样才能做到这一点

编辑: 我在使用泛型,它是一个泛型类。这意味着我对扩展我的类没有任何线索。所以不,我不能只在[]之前添加类名

编辑2: 正如已经指出的,返回这个数组没有任何意义(那是我的错误)。所以我要做的是返回一个扩展类类型的数组。 例如:

public abstract class MappingObject {
    public ExtendedClassType[] search (string search) {
    }
}
找到了解决办法。很抱歉,事情很简单

public abstract class MappingObject<T> where T : new() {
    public static List<T> search(string search) {
    }
}
公共抽象类映射对象,其中T:new(){
公共静态列表搜索(字符串搜索){
}
}

我不完全确定您在寻找什么,但根据您问题中的一些线索,您可能希望回顾以下内容(称为:

公共抽象类MyBaseClass:其中T:MyBaseClass
{
公共摘要T[]搜索(字符串搜索);
}
公共类派生类:MyBaseClass
{
公共覆盖DerivedClass[]搜索(字符串搜索)
{
返回新的DerivedClass[0];
}
}
这是可能的,但我不确定这是否是您正在寻找的,我会回顾一下,看看这是否是一个好的设计选择,它感觉有点漏洞百出

在诸如CSLA.NET之类的框架中使用了这种特殊的思想,以便在从某些基类继承时向派生类自身公开强引用。这通常是一个“语法糖”的东西,并且避免了在从基类检索它们时,为了在自己的类型上使用这些东西而不得不抛出很多东西。基类本身仍然不应该理解从它派生的类型


。它有它的陷阱,他揭露了它可能被滥用的方式。我个人认为,意识到这些陷阱和滥用的可能性已经足够好了,只要事情经过测试,如果案件清楚,我很乐意使用可能违反指导原则或原则的东西(没有足够的额外信息来理解这个特定案件是否清楚)。埃里克的文章结尾:

尽管如此,在实践中,有时使用这种模式确实能以C#中难以建模的方式务实地解决问题;它允许您对虚拟方法上没有协变返回类型这一事实以及类型系统的其他缺点进行一点结束运行。严格来说,它这样做的方式并没有强制执行您可能喜欢的每一个约束,这是很不幸的,但在现实的代码中,这通常不是一个阻止产品发布的问题

我的建议是,在实施这类计划之前,要仔细考虑 C#中的奇异模式;对客户的好处真的超过了吗 与您在代码上施加的精神负担相关的成本 维护人员?


我所看到的这种模式的最佳使用是将所有重复出现的部分保留在内部或受保护,而将公共API保留在一旁。

“this”指的是类的这个实例,因此您的代码此时基本上说“我想返回MyClass的这个实例的一个数组”,这是没有意义的

我想您应该说‘我想返回这种类型的类对象数组’

因此,将方法的返回类型指定为类名

public YourClassName[] Search(string search)
{

}
你是说

public class YourClass
{
    public T[] Search<T>(string search, Convertor<SearchResult, T> convertor)
    {
        ...
        List<SearchResult> results = ...
        return results.ConvertAll(convertor).ToArray();
    }
}
公共类您的类
{
公共T[]搜索(字符串搜索、转换器)
{
...
列出结果=。。。
返回结果.ConvertAll(convertor.ToArray();
}
}

这样,您可以将转换委托给调用方,调用方将知道作为泛型类型参数传递的类型。

指定扩展。为什么不用实际的类名替换
这个
?为什么不能只使用实际的类名<代码>公共MyClass[]搜索(字符串s){}您不能也不应该这样做。这是错误设计和对OOP的误解的标志。这个类是抽象的,它使用泛型。所以我不知道类名是什么,因为它可以被任何类扩展(继承)。我建议在你接受任何答案之前阅读。如果我派生了DerivedClass呢?我知道这是一种模式,我知道我在某个地方读到过,这是一种糟糕的模式。“但是我记不起来了。那就别从DerivedClass派生了。”MatthewWatson这种模式只适用于一个继承级别的事实让我对它有了很大的不同。基本上破坏了任何合理的OOP设计。@如果您真的愿意,您可以将DerivedClass声明为
DerivedClass
。一个问题的解决方案不必对所有可能的可能性保持开放。阅读某件事是“坏模式”并不能使其成为一条规则,你应该经常回顾为什么这样的事情是坏的,以及在你的上下文中它是否是坏的。我已经看到这种模式在正确的情况下发挥了良好的效果。@Euphoric如果OP只需要一个级别的继承,就可以了。您可以密封该类以防止意外的进一步继承。你太武断了。如果需要,还可以引入中间抽象类。
public class YourClass
{
    public T[] Search<T>(string search, Convertor<SearchResult, T> convertor)
    {
        ...
        List<SearchResult> results = ...
        return results.ConvertAll(convertor).ToArray();
    }
}