派生集合 class
collection of derived class
我正在重构我的关注点分离 (SoC) 代码。将非 AutoCAD 代码移到单独的 dll,因此 Common、Data Access、Web 服务、AutoCAD 相关……在不同的 dll 文件中。
这是我的示例 class:
// 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> ?
{
}
我的问题是,我可以运行像
这样的东西吗?
AcadLocs myAcadLocs = new AcadLocs();
AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1); // How to make this works?
我试过:
public class AcadLocs : Locs // or List<AcadLoc> ?
{
public AcadLoc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
}
这是行不通的。
现在我改成这样:
public interface ILocData<T> where T : new() {}
// non-AutoCAD dll
public class Loc : ILocData<Loc>
{
public int Id;
public string Name;
...
}
// AutoCAD dll
public class AcadLoc : Loc, ILocData<AcadLoc>
{
public ObjectId oid;
}
public class LocDataCollection<T, TCollection> : List<T>
where T : ILocData<T>, new()
where TCollection : LocDataCollection<T, TCollection>, new()
{
}
// non-AutoCAD dll
public class Locs : LocDataCollection<Loc, Locs>
{
public Loc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
public bool Check()
{
foreach (Loc loc in this)
{
....
}
}
}
// AutoCAD dll
public class AcadLocs : LocDataCollection<AcadLoc, AcadLocs>
{
public AcadLoc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
}
现在,
AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1); // works
但是
myAcadLocs.Check(); // failed
谢谢
韦斯
我想你需要的是扩展方法
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();
我指的是你的第一次尝试。
1。继承
public class AcadLocs : Locs // or List<AcadLoc> ?
如果你想派生自Locs
或List<AcadLoc>
取决于你想如何使用这个class。如果你想声明公共成员,或者如果有必要,你可以将 AcadLocs
的实例分配给类型 Locs
的变量,如下所示
Locs locs = new AcadLocs();
那么你肯定需要从 Locs
.
派生
2。 Get_By_Id
对于此方法,我将使用 OfType<>
方法,如下所示:
public class AcadLocs : Locs // or List<AcadLoc> ?
{
public AcadLoc Get_By_Id(int id)
{
return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
}
}
OfType<AcadLoc>
从现有序列中创建一个 IEnumeralbe<AcadLoc>
,仅选择指定类型 (AcadLoc
) 的元素。这也将帮助您使用 Check
方法。
我正在重构我的关注点分离 (SoC) 代码。将非 AutoCAD 代码移到单独的 dll,因此 Common、Data Access、Web 服务、AutoCAD 相关……在不同的 dll 文件中。
这是我的示例 class:
// 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> ?
{
}
我的问题是,我可以运行像
这样的东西吗?AcadLocs myAcadLocs = new AcadLocs();
AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1); // How to make this works?
我试过:
public class AcadLocs : Locs // or List<AcadLoc> ?
{
public AcadLoc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
}
这是行不通的。
现在我改成这样:
public interface ILocData<T> where T : new() {}
// non-AutoCAD dll
public class Loc : ILocData<Loc>
{
public int Id;
public string Name;
...
}
// AutoCAD dll
public class AcadLoc : Loc, ILocData<AcadLoc>
{
public ObjectId oid;
}
public class LocDataCollection<T, TCollection> : List<T>
where T : ILocData<T>, new()
where TCollection : LocDataCollection<T, TCollection>, new()
{
}
// non-AutoCAD dll
public class Locs : LocDataCollection<Loc, Locs>
{
public Loc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
public bool Check()
{
foreach (Loc loc in this)
{
....
}
}
}
// AutoCAD dll
public class AcadLocs : LocDataCollection<AcadLoc, AcadLocs>
{
public AcadLoc Get_By_Id(int id)
{
return this.SingleOrDefault(n => n.Id == id);
}
}
现在,
AcadLoc myAcadLoc = myAcadLocs.Get_By_Id(1); // works
但是
myAcadLocs.Check(); // failed
谢谢
韦斯
我想你需要的是扩展方法
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();
我指的是你的第一次尝试。
1。继承
public class AcadLocs : Locs // or List<AcadLoc> ?
如果你想派生自Locs
或List<AcadLoc>
取决于你想如何使用这个class。如果你想声明公共成员,或者如果有必要,你可以将 AcadLocs
的实例分配给类型 Locs
的变量,如下所示
Locs locs = new AcadLocs();
那么你肯定需要从 Locs
.
2。 Get_By_Id
对于此方法,我将使用 OfType<>
方法,如下所示:
public class AcadLocs : Locs // or List<AcadLoc> ?
{
public AcadLoc Get_By_Id(int id)
{
return this.OfType<AcadLoc>().SingleOrDefault(n => n.Id == id);
}
}
OfType<AcadLoc>
从现有序列中创建一个 IEnumeralbe<AcadLoc>
,仅选择指定类型 (AcadLoc
) 的元素。这也将帮助您使用 Check
方法。