C# 单态遗传#

C# 单态遗传#,c#,design-patterns,reflection,singleton,C#,Design Patterns,Reflection,Singleton,我试图为我的日志系统实现一个单例继承,这样我就能够将系统事件与用户行为分开。我找到了。尽管存在泛型差异,我还是可以实现附带的第一个版本(暂时不支持线程安全) 公共抽象类日志 { 私有静态volatile Dictionary实例=new Dictionary(); 公共静态日志GetInstance(类型){ 日志实例=null; 如果(!Log.instances.ContainsKey(类型)) { ConstructorInfo-ctor=type.GetConstructor(Bindi

我试图为我的日志系统实现一个单例继承,这样我就能够将系统事件与用户行为分开。我找到了。尽管存在泛型差异,我还是可以实现附带的第一个版本(暂时不支持线程安全)

公共抽象类日志
{
私有静态volatile Dictionary实例=new Dictionary();
公共静态日志GetInstance(类型){
日志实例=null;
如果(!Log.instances.ContainsKey(类型))
{
ConstructorInfo-ctor=type.GetConstructor(BindingFlags.Default,
无效的
新类型[0],
新的参数修改器[0]);
instance=ctor.Invoke(新对象[0])作为日志;
实例。添加(类型、实例);
}
其他的
{
instance=Log.instances[type];
}
返回实例;
}
私有日志(){}
公共类UserLog:Log
{
private UserLog():base(){}
}       
公共类SystemLog:Log
{
私有系统日志():base(){}
}
}
上面的突出显示行显示了创建新实例的尝试。但is不工作,返回ConstructorInfo的空实例

1) 有关于如何使用GetConstructor方法的想法吗?我知道它有3个重载版本,但第一个版本只适用于公共构造函数。如果我将构造函数的可见性更改为public,我可以使用其他重载版本(),但是这个特定版本甚至不能使用public构造函数


2) 在C#中,是否可以像我尝试的那样从其他类调用私有构造函数?我已经在Java中实现了它,但在C中可能会有所不同。

因为绑定标志没有指定
Private
,所以无法获得私有构造函数。如果有public,则需要指定
public

也就是说,我不理解您希望以这种方式实现这一点。这似乎是没有充分理由的大量额外工作

我会这样做:

public abstract class Log
{
    public class UserLog : Log
    {
        private static readonly Lazy<UserLog> _instance =
            new Lazy<UserLog>(() => new UserLog());
        public static UserLog Instance { get { return _instance.Value; } }
    }

    public class SystemLog : Log
    {
        private static readonly Lazy<SystemLog > _instance =
            new Lazy<SystemLog >(() => new SystemLog ());
        public static SystemLog Instance { get { return _instance.Value; } }
    }
}
公共抽象类日志
{
公共类UserLog:Log
{
私有静态只读惰性\u实例=
新的惰性(()=>newuserlog());
公共静态用户日志实例{get{return}\u Instance.Value;}}
}
公共类SystemLog:Log
{
私有静态只读惰性\u实例=
新的延迟(()=>newsystemlog());
公共静态SystemLog实例{get{return}\u Instance.Value;}}
}
}

也就是说,对于每个实际的单例类,只需遵循普通的单例习惯用法。

如果指定泛型类型必须从Log继承,并且它将具有new(),则可以不使用无参数构造函数。您还必须将构造函数更改为protected,以便子类可以调用它:

公共抽象类日志
{
私有静态volatile Dictionary实例=new Dictionary();
公共静态TLogType GetInstance(),其中TLogType:Log,new()
{
TLogType实例=null;
var type=typeof(TLogType);
如果(!Log.instances.ContainsKey(类型))
{
实例=新的TLogType();
实例。添加(类型、实例);
}
其他的
{
instance=(TLogType)Log.instances[type];
}
返回实例;
}
受保护的日志(){}
}

我认为您不能在类之外调用私有构造函数(毕竟它们是私有的),但是通过反射,可能可以做一些事情(我不是反射专家)。使用protected而不是private可能会得到您想要的结果

单例具有私有构造函数,因此您不能使用invoke。您不能调用抽象类。将其设置为单例不会使其成为自。无法对子类强制执行单例要求。请注意,由于父类构造函数是私有的,因此无法在子类中调用构造函数。UserLog():base(){}将无法工作。谢谢Peter!我怎么能把这些词义储存在字典里?你为什么要这么做?在什么样的上下文中,您有一个
类型
可以用于字典中的键,但不能简单地编写类似
UserLog.Instance
SystemLog.Instance的内容(视情况而定)?也就是说,您如何在不知道实际类型名称或已经有单例实例的情况下获得单例对象的
Type
实例?
public abstract class Log
{
    public class UserLog : Log
    {
        private static readonly Lazy<UserLog> _instance =
            new Lazy<UserLog>(() => new UserLog());
        public static UserLog Instance { get { return _instance.Value; } }
    }

    public class SystemLog : Log
    {
        private static readonly Lazy<SystemLog > _instance =
            new Lazy<SystemLog >(() => new SystemLog ());
        public static SystemLog Instance { get { return _instance.Value; } }
    }
}