在 C# 8.0 中使用带有静态 属性 的接口创建 Singleton 时出错

Error while creating Singleton using interface with static property in C# 8.0

使用具有静态属性的接口创建单例时出现问题。

public interface ISingleton<T> where T : new()
{
    static T instnace { get; set; }
    static T Instance
    {
        get
        {
            instnace ??= new T();
            return instnace;
        }
    }
}

public class Manager : ISingleton<Manager>
{
}

// TODO : Error!
var manager = Manager.Instance;

问题是我找不到那个接口里定义的Instance 属性
为什么我找不到 属性?

您在接口上调用静态,而不是在实现上调用静态 class

 var manager = ISingleton<Manager>.Instance;

这是一个不好的做法,所以我不会使用那样的界面,但这里是如何使用它的。

public interface ISingleton<T> where T : new()
{
    static T Instance { get; } = new T();
}

public class Manager : ISingleton<Manager>
{
}

// then later
var manager = ISingleton<Manager>.Instance;

或者另一个解决方案可能是这样的:

// this is an implementation similar to EmptyArray<T> internal BCL type.

public static class Singleton<T> where T : new()
{
    public static readonly T Instance = new T();
}

// then you can access it this way
var manager = Singleton<Manager>.Instance;

// Note: in this case the T type does not have to implement any specific interface.

无论如何,我建议考虑使用 DI 框架而不是手动实现单例模式。