简体   繁体   English

C#Func <>委托属性设置器问题

[英]C# Func<> Delegate property setter issue

I am trying to return an object of type IDocumentTemplateProvider using a delegate as below: 我试图使用委托返回IDocumentTemplateProvider类型的对象,如下所示:

public static class DocumentTemplateProvider
{
    private static Func<IDocumentTemplateProvider> _docTemplateProvider;

    public static void SetdocTemplateProvider(Func<IDocumentTemplateProvider> docTemplateProvider)
    {
        _docTemplateProvider = docTemplateProvider;
    }

    public static void SetDocTemplateProvider<T>() where T : IDocumentTemplateProvider, new()
    {
        _docTemplateProvider = () => new T();
    }

    public static IDocumentTemplateProvider TemplateProvider
    {
        get { return _docTemplateProvider(); }
    }
}

However when I'm calling it using: 但是,当我使用时调用它:

private static readonly IDocumentTemplateProvider _template = DocumentTemplateProvider.TemplateProvider;

_template is always null. _template始终为null。 I'm fairly new to C# Func<> delegates so i can't bloody see what I'm doing wrong. 我是C#Func <>代表的新手,所以我不能看到我做错了什么。 Can someone point me to the right direction? 有人能指出我正确的方向吗?

Thanks 谢谢

UPDATE: To clear ant confusion i've added the full code where _template is initialized and used as is: 更新:为了清除蚂蚁的混乱,我添加了完整的代码,其中_template被初始化并按原样使用:

 public class DocumentModule : IHttpModule
{
        private static readonly IDocumentTemplateProvider _template = DocumentTemplateProvider.TemplateProvider;

        public void Init(HttpApplication context)
        {
            context.BeginRequest += OnBeginRequest;
            context.EndRequest += OnEndRequest;
        }      

        public void Init(HttpApplication context)
        {
            context.BeginRequest += OnBeginRequest;
            context.EndRequest += OnEndRequest;
        }

        private void OnBeginRequest(object sender, EventArgs eventArgs)
        {
            _template.SetProvider();
        }

        private void OnEndRequest(object sender, EventArgs e)
        {
            _template.Finalize();
        }        

        public void Dispose()
        {
        }
}

It is null because it is has never been set. 它为null,因为它从未设置过。 You have two Void methods that set the _docTemplateProvider variable, so you need to call them first, like the example code below 你有两个Void方法设置_docTemplateProvider变量,所以你需要先调用它们,就像下面的示例代码

class Program
{
    private static void Main()
    {
        DocumentTemplateProvider.SetDocTemplateProvider<Test>();
        //OR
        DocumentTemplateProvider.SetdocTemplateProvider(() => new Test());

        IDocumentTemplateProvider _template = DocumentTemplateProvider.TemplateProvider;

        Console.ReadLine();
    }

    public static class DocumentTemplateProvider
    {
        private static Func<IDocumentTemplateProvider> _docTemplateProvider;

        public static void SetdocTemplateProvider(Func<IDocumentTemplateProvider> docTemplateProvider)
        {
            _docTemplateProvider = docTemplateProvider;
        }

        public static void SetDocTemplateProvider<T>() where T : IDocumentTemplateProvider, new()
        {
            _docTemplateProvider = () => new T();
        }

        public static IDocumentTemplateProvider TemplateProvider
        {
            get { return _docTemplateProvider(); }
        }
    }
}

internal interface IDocumentTemplateProvider
{
}

public class Test : IDocumentTemplateProvider
{
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM