Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 派生类的集合_C#_Collections_Derived Class - Fatal编程技术网

C# 派生类的集合

C# 派生类的集合,c#,collections,derived-class,C#,Collections,Derived Class,我正在重构我的关注点分离(SoC)代码。将非AutoCAD代码移到不同dll文件中的单独dll(如此常见)、数据访问、web服务、AutoCAD相关等 以下是我的班级样本: // non-AutoCAD dll public class Loc { public int Id; public string Name; ... } // AutoCAD dll public class AcadLoc : Loc { public ObjectId oid; }

我正在重构我的关注点分离(SoC)代码。将非AutoCAD代码移到不同dll文件中的单独dll(如此常见)、数据访问、web服务、AutoCAD相关等

以下是我的班级样本:

// non-AutoCAD dll
public class Loc
{
    public int Id;
    public string Name;
    ...
}

// AutoCAD dll
public class AcadLoc : Loc
{
    public ObjectId oid;
}

// non-AutoCAD dll
public class Locs : List<Loc>
{
    public Loc Get_By_Id(long id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }
}

// AutoCAD dll
public class AcadLocs : Locs // or List<AcadLoc> ? 
{
}
我试过:

public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.SingleOrDefault(n => n.Id == id);
    }
}
但是

谢谢


Wes

我认为您需要的是扩展方法

public static class MyExtension 

{
    public static Loc Get_By_Id(this Locs l,int id) 
    {
        return l.SingleOrDefault(n => n.Id == id);
    }

    public static bool Check(this Locs l)
    {
        foreach (Loc loc in l)
        {
        ....
        }
    }
}
一旦你有了这段代码,就可以像这样调用这些方法

 myAcadLocs.Get_By_Id(1);
 myAcadLocs.Check();
 myLocs.Get_By_Id(1);
 myLocs.Check();
Locs locs = new AcadLocs();

我想你需要的是扩展方法

public static class MyExtension 

{
    public static Loc Get_By_Id(this Locs l,int id) 
    {
        return l.SingleOrDefault(n => n.Id == id);
    }

    public static bool Check(this Locs l)
    {
        foreach (Loc loc in l)
        {
        ....
        }
    }
}
一旦你有了这段代码,就可以像这样调用这些方法

 myAcadLocs.Get_By_Id(1);
 myAcadLocs.Check();
 myLocs.Get_By_Id(1);
 myLocs.Check();
Locs locs = new AcadLocs();

我指的是你的第一次尝试

1.遗产 那么您肯定需要从
loc
派生

2.通过Id获取 对于此方法,我将使用类型为的
方法,如下所示:

public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
    }
}
公共类AcadLocs:Locs//还是列表?
{
公共AcadLoc按Id获取(int Id)
{
返回此.OfType().SingleOrDefault(n=>n.Id==Id);
}
}

of type
从现有序列中创建一个
IEnumeralbe
,只选择指定类型的元素(
AcadLoc
)。这也将对您的
检查方法有所帮助。

我指的是您的第一次尝试

1.遗产 那么您肯定需要从
loc
派生

2.通过Id获取 对于此方法,我将使用类型为
方法,如下所示:

public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
    }
}
公共类AcadLocs:Locs//还是列表?
{
公共AcadLoc按Id获取(int Id)
{
返回此.OfType().SingleOrDefault(n=>n.Id==Id);
}
}

of type
从现有序列中创建一个
IEnumeralbe
,只选择指定类型的元素(
AcadLoc
)。这也将帮助您使用
检查
方法。

“//失败”--如何?如果您不告诉我们失败的原因,我们如何回答您的问题?我收到了编译错误消息:“AcadLocs”不包含“Check”的定义,并且找不到接受“AcadLocs”类型的第一个参数的扩展方法“Check”(您是否缺少using指令或程序集引用?//failed)--如何?如果您不告诉我们失败的原因,我们如何回答您的问题?我收到了编译错误消息:“AcadLocs”不包含“Check”的定义,并且找不到接受“AcadLocs”类型的第一个参数的扩展方法“Check”(您是否缺少using指令或程序集引用?)
public class AcadLocs : Locs // or List<AcadLoc> ? 
{
    public AcadLoc Get_By_Id(int id)
    {
        return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
    }
}