将内部类用作List <t>中的T

时间:2018-10-06 13:26:03

标签: c#

代码:

  

使用内部类进行组装(示例类)

internal class Abc
{
    int a;
    float pos;
}

我如何用内部类List<T>来创建T的Abc

这是一个外部程序集,这意味着我无法执行InternalsVisibleTo,并且该程序集不是我自己制作的,所以我不能仅仅对其进行编辑。

3 个答案:

答案 0 :(得分:1)

我认为<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:SAOS1ConnectionString %>" SelectCommand="SELECT attendance.Atd_Date, attendance.Atd_InTime, attendance.Atd_OutTime, attendance.Atd_Comment, attendance.Status, attendance.SID, student.S_FName, student.S_LName FROM attendance INNER JOIN student ON attendance.SID = student.SID INNER JOIN class ON student.CID = class.CID WHERE (class.CID = @CID) AND (attendance.Atd_Date = @Atd_Date)" UpdateCommand="updatetable2" UpdateCommandType="StoredProcedure"> <SelectParameters> <asp:ControlParameter ControlID="LabelClassID" Name="CID" PropertyName="Text" /> <asp:ControlParameter ControlID="datepicker" Name="Atd_Date" PropertyName="Text" /> </SelectParameters> <UpdateParameters> <asp:Parameter Name="Atd_ID" Type="Int32" /> <asp:Parameter DbType="Date" Name="Atd_Date" /> <asp:Parameter DbType="Time" Name="Atd_InTime" /> <asp:Parameter DbType="Time" Name="Atd_OutTime" /> <asp:Parameter Name="Atd_Comment" Type="String" /> <asp:Parameter Name="Status" Type="String" /> <asp:Parameter Name="SID" Type="Int32" /> <asp:Parameter Name="S_FName" Type="String" /> <asp:Parameter Name="S_LName" Type="String" /> </UpdateParameters> </asp:SqlDataSource> 问题是有争议的。您似乎真正要问的是“如何将内部实现公开给公共API?”

有几种选择:

  • 使用接口(如果实现与功能相关)
  • 使用抽象类(如果派生类型通过身份相关)
  • 使用基类(如果派生类型通过身份相关,并且基类也可以实例化)

示例

考虑List<T>AbcBase在单独的程序集中。

AbcInternal

考虑// Provides a publicly available class. // Note, the internal default constructor will only allow derived types from the same assembly, meaning the class is essentially sealed to the outside world public class AbcBase { internal AbcBase() { } protected int a; protected float pos; public static List<AbcBase> CreateList() { return new List<AbcBase>() { new AbcInternal(1, 2.3f), new AbcInternal(4, 5.6f) }; } } internal sealed class AbcInternal : AbcBase { public AbcInternal(int a, float pos) { this.a = a; this.pos = pos; } } 在使用程序集中,或者换句话说,引用实现ProgramAbcBase的程序集

AbcInternal

请注意,公开实现是通过class Program { static void Main(string[] args) { List<AbcBase> list = AbcBase.CreateList(); } } 公开的,而不是内部实现公开的。

AbcBase

请注意,以上内容将导致编译器错误,因为public class AbcImpl : AbcBase { } 中的构造函数是内部的,因此不能从其他程序集中覆盖此类。

  

'AbcBase.AbcBase()'由于其保护级别而无法访问

答案 1 :(得分:0)

不能。 internal将对类型的访问限制为仅包含程序集。

答案 2 :(得分:0)

只要您拥有Abc类型的变量,就可以执行以下操作:

// Get the value of type Abc with its runtime type.
var abc = ...;

// Variable listOfAbcs will be of type List<Abc>.
var listOfAbcs = CreateList(abs);

// Local function to create a list.
List<T> CreateList<T>(T value) => new List<T>();

或者,您可以创建一个包含反射的列表,并通过IList界面进行访问。