Ign*_*cia 6 .net c# generics restriction
我已经创建了一个需要实例化其实现类型的泛型类,因此实现类型必须具有可访问的参数而不是构造函数.看起来new()限制可以完成这项工作,但是当我将其设置为内部时,它强制执行类型以具有公共构造函数(但是两者都在同一个程序集中可访问).
提前致谢.
编辑:这样做的原因是我有一个必须通过Singleton使用的类X. Singleton类是一个泛型类,我想使类X构造函数内部避免外部用户以错误的方式访问对象(调用构造函数).
如规范绑定和未绑定类型的 4.4.3部分所述,C#语言不允许这样做.
如果约束是构造函数约束
new(),则类型A不能是abstract且必须具有公共无参数构造函数.如果满足下列条件之一,则满足.
A是一个值类型,因为所有值类型都有一个公共默认构造函数A是具有cosntructor约束的类型参数A是具有值类型约束的类型参数A是一个不是的类,abstract包含一个public没有参数的显式声明的构造函数A不是,abstract并有一个默认的构造函数.
如果不满足任何一个条件,则编译器错误.如果您发现自己的类型是公共的但只有内部构造函数,那么它们很可能实际上应该是具有公共构造函数的内部类型.
我建议将类型访问器internal及其构造函数更改为public,并使其无参数.你public那么参数的构造函数可以调用通过对非参private或internal构造函数做任何额外的初始化工作.
internal class C<T> where : T new()
{
public C() : this(new T()) {
}
private C(T t) {
// Do additional initialization
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,模式是有限的,但没有什么能阻止您使用private方法.
internal class C<T> where T : new() {
public C() {
T t = new T();
InitializeClass(t);
}
private void InitializeClass(T t) {
throw new NotImplementedException();
}
}
Run Code Online (Sandbox Code Playgroud)
根据您的更新,这是一个公共单例模式的小例子.
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() : this(new T()) {
}
private Singleton(T t) {
Current = this;
// Do whatever you need to with T
}
public String Name {
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
用法
// Somewhere in your internal assembly
Singleton<String> singleton = new Singleton<String>();
// In an external assembly
Singleton.Current.Name = "SoMoS";
Run Code Online (Sandbox Code Playgroud)
你甚至不需要以这种方式使用构造函数,你可以轻松地做一些简单的事情.
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() {
T t = new T();
// Do stuff with T
}
public String Name {
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你不能设计它以满足你的要求,泛型可能不是你要走的路.泛型只能做很多事情并且不能解决所有问题.有工厂模式,注塑等等.