gpt4 book ai didi

c# - 动态创建类而不是使用开关 block 的最佳方法

转载 作者:太空狗 更新时间:2023-10-29 22:15:03 24 4
gpt4 key购买 nike

目前,我在实现接口(interface) IOutputCacheVaryByCustom 的类中实现了 VaryByCustom 功能

public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
HttpContext Context { get; }
}

实现此接口(interface)的类有一些约定,类的名称将是“OutputCacheVaryBy_______”,其中空白是从页面上的 varyByCustom 属性传入的值。另一个约定是 Context 将通过构造函数注入(inject)来设置。

目前我基于一个枚举和一个类似 switch 的语句

public override string GetVaryByCustomString(HttpContext context, 
string varyByCustomTypeArg)
{
//for a POST request (postback) force to return back a non cached output
if (context.Request.RequestType.Equals("POST"))
{
return "post" + DateTime.Now.Ticks;
}
var varyByCustomType = EnumerationParser.Parse<VaryByCustomType?>
(varyByCustomTypeArg).GetValueOrDefault();


IOutputCacheVaryByCustom varyByCustom;
switch (varyByCustomType)
{
case VaryByCustomType.IsAuthenticated:
varyByCustom = new OutputCacheVaryByIsAuthenticated(context);
break;
case VaryByCustomType.Roles:
varyByCustom = new OutputCacheVaryByRoles(context);
break;
default:
throw new ArgumentOutOfRangeException("varyByCustomTypeArg");
}

return context.Request.Url.Scheme + varyByCustom.CacheKey;
}

因为我一直都知道该类将是 OutputCacheVaryBy + varyByCustomTypeArg 并且唯一的构造函数参数将是 context 我意识到我可以绕过需要这个美化 if else block 并且可以只需使用 Activator 实例化我自己的对象。

话虽如此,反射并不是我的强项,而且我知道 Activator 与静态创建和其他生成对象的方法相比要慢得多。有什么理由让我坚持使用当前代码,或者我应该使用 Activator 或类似的方式来创建我的对象?

我看过博客http://www.smelser.net/blog/post/2010/03/05/When-Activator-is-just-to-slow.aspx但我不太确定这将如何应用,因为我在运行时使用类型而不是静态 T。

最佳答案

如果 Reflection 对你来说太慢了。您可能可以让自己的 ObjectFactory 工作。这真的很容易。只需向您的界面添加一个新方法。

    public interface IOutputCacheVaryByCustom
{
string CacheKey { get; }
IOutputCacheVaryByCustom NewObject();
}

然后创建一个包含对象模板的静态只读 CloneDictionary。

    static readonly
Dictionary<VaryByCustomType, IOutputCacheVaryByCustom> cloneDictionary
= new Dictionary<VaryByCustomType, IOutputCacheVaryByCustom>
{
{VaryByCustomType.IsAuthenticated, new OutputCacheVaryByIsAuthenticated{}},
{VaryByCustomType.Roles, new OutputCacheVaryByRoles{}},
};

如果你完成了那个,你可以使用你已经拥有的枚举来选择字典中的模板并调用 NewObject()

        IOutputCacheVaryByCustom result = 
cloneDictionary[VaryByCustomType.IsAuthenticated].NewObject();

就这么简单。您必须实现的 NewObject() 方法将通过直接创建对象返回一个新实例。

    public class OutputCacheVaryByIsAuthenticated: IOutputCacheVaryByCustom
{
public IOutputCacheVaryByCustom NewObject()
{
return new OutputCacheVaryByIsAuthenticated();
}
}

这就是您所需要的。而且速度快得令人难以置信。

关于c# - 动态创建类而不是使用开关 block 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3580024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com