代码:
使用内部类进行组装(示例类)
internal class Abc
{
int a;
float pos;
}
我如何用内部类List<T>
来创建T的Abc
?
这是一个外部程序集,这意味着我无法执行InternalsVisibleTo
,并且该程序集不是我自己制作的,所以我不能仅仅对其进行编辑。
答案 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;
}
}
在使用程序集中,或者换句话说,引用实现Program
和AbcBase
的程序集
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
界面进行访问。