2017-07-02 129 views
0

我创建了名称为SingletonGenerator<>的泛型类。用于实现Singelton设计模式。所以,下面的代码是它的类:为什么静态方法在单例实例中不可用?

SingletonGenerator.cs

public class SingletonGenerator<T> where T : class, new() 
{ 
    private static readonly Lazy<T> _instance = 
     new Lazy<T>(() => new T(), LazyThreadSafetyMode.ExecutionAndPublication); 

    private SingletonGenerator() 
    { 
    } 

    public static T Instance => _instance.Value; 
} 

而且,创建其他类获得实例:

AppDb.cs

public class AppDbContext 
{ 
    public string Database { get; set; } 
    private static string ConnectionString { get; set; } 

    public static void Send() 
    { 
    } 

    public void Go() 
    { 
    } 
} 

Program.cs

class Program 
{ 
    static void Main(string[] args) 
    { 
     var context = SingletonGenerator<AppDbContext>.Instance; 

     var database = context.Database; // is available 
     var connection = context.ConnectionString; //is not available 

     context.Go(); // is available 
     context.Send(); // is not available 
    } 
} 

我的问题是为什么静态方法在单例实例中不可用?

而我的代码是正确的?

+0

好......这些都是'static'不'instance'成员,让你从类型访问它们不是实例:'AppDbContext.ConnectionString' –

+3

你能不能读编译错误? –

回答

1

静态成员无法通过一个实例来引用。而是通过类型名称引用它 。

来自docs

问题无关的事实你的实例是一个单独的,引用静态成员使用的类型名称:

AppDbContext.Send(); 
1

对于初学者ConnectionStringprivate。您无法从其他课程访问它。您也不能从实例访问static方法。你需要使用类

AppDbContext.ConnectionString; 

AppDbContext.Send(); 
1

很好,因为它们是静态的,属于类型(在你的情况AppDbContext )而不是对象实例,尽管用于访问它的属性是静态的,但仍然创建一个实例的单例模式。所以,你可以给他们打电话与类型名称

var connection = AppDbContext.ConnectionString; 
AppDbContext.Send(); 
相关问题