首页 > 解决方案 > 从单例实例获取设置为空

问题描述

我目前正在编写一个 api,该 api 是我想用 C# 编写的 ac ++ 插件,该 api 实际上几乎完成了,只是我现在有一个问题让我烦恼了几个小时

问题如下

 // this class is in the api dll file
    public class SingleData
    {
        public static Lazy<SingleData> val = new Lazy<SingleData>(() => new IPlugin());
        public static IPlugin Instance { get { return val.Value; } }

        protected SingleData() { }

        public string Author { get; set; }
        public string Name { get; set; }

        public virtual void plugin_getUser(UserData user) { }
    }    

    // this class is also in the api dll file
    public class DllExport { 
        [DllExport] public static void plugin_getUser(UserData user) { return SingleData.Instance.plugin_getUser(user); }
     }

    // this is NOT in the dll file 
    // I want that people who use my API only make it like this
    public class Main : SingleData {
        public Main() {
           Author = "Hans";
           Name = "test plugin";
        }
        public override void plugin_getUser(UserData user) { 
           Console.WriteLine(user.OnlineTime);
        }    
    }

所以现在的问题是如果我删除了不能return SingleData.Instance.plugin_getUser在 DllExport 类中使用的单例并且AuthorandName变量为空。

我现在有一些问题,如何在 Main 类中花费事件而无需输入return SingleData.instance.plugin_getUserDllExport 类

另一个问题是,我怎么能做得不同,但主类应该和我指定的一样

标签: c#

解决方案


我认为这可能是您可能想要考虑奇怪的重复模式的情况,

    public class SingleData<T> where T : SingleData<T>, new()
    {
        public static Lazy<T> val = new Lazy<T>(() => new T());
        public static IPlugin Instance { get { return val.Value; } }

        protected SingleData() { }

        public string Author { get; set; }
        public string Name { get; set; }

        public virtual void plugin_getUser(UserData user) { }
    }    

    // this class is also in the api dll file
    public class DllExport
    { 
        [DllExport]
        public static void plugin_getUser(UserData user) { return SingleData<Main>.Instance.plugin_getUser(user); }
     }

用法,

    public class Main : SingleData<Main>
    {
        public Main()
        {
           Author = "Hans";
           Name = "test plugin";
        }

        public override void plugin_getUser(UserData user)
        { 
           Console.WriteLine(user.OnlineTime);
        }    
    }

推荐阅读