在 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 框架而不是手动实现单例模式。
使用具有静态属性的接口创建单例时出现问题。
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 框架而不是手动实现单例模式。