gpt4 book ai didi

c# - 类型 T 的动态通用声明

转载 作者:太空宇宙 更新时间:2023-11-03 17:28:49 24 4
gpt4 key购买 nike

我有一个存储类型字典的数组:

//The dictionary:
Dictionary<CacheKey,Type> TypeLookup;

//This is the enum:
public enum CacheKey
{
UserProfile,
CustomerQuickSearch,
CommissionConfiguration
}

我想用这个字典来声明一个类型为 T 的变量

        //instead of 
T myvar;

//I want to dynamically declare myvar as:
//1)get the type for the cacheKey from the dictionary:
Type type = TypeLookup[cacheKey];
//2)declare myvar as the corresponding Type:
type myvar;

背景是我正在构建一个分布式缓存基础设施。我有一个很棒的小 CachingProvider,它允许您更新缓存中的项目。

我想将此方法公开为 Web 服务,以便我场中的所有服务器都可以更新其缓存。但我只想将一种方法公开为 Web 服务,然后更新缓存中的相应项目。

这是我要公开的方法:

   public static void UpdateCacheEntryItem<T>(CacheKey cacheKey, int id)
{
//look up the cacheEntry in cache which is a dictionary.
Dictionary<int, T> cacheEntry = (Dictionary<int, T>) CacheRef[cacheKey.ToString()];

//call the corresponding method which knows how to hydrate that item and pass in the id.
cacheEntry[id] = (T)HydrateCacheEntryItemMethods[cacheKey].Invoke(id);
}

我尝试过的事情:1) 我尝试将方法直接公开为 WCF 服务,但由于方法的原因,这当然不起作用。2)我尝试转换会找到的字典,因为我不需要对返回值做任何事情,我只需要更新缓存中的项目。但这也没有用。我得到的错误:无法将类型为“System.Collections.Generic.Dictionary2[System.Int32,CachingPrototype.CustomerQuickSearch]”的对象转换为键入“System.Collections.Generic.Dictionary2[System .Int32,System.Object]'.

您的评论非常有帮助,帮助我回答了我的问题。我想出的解决方案是简单地将我的 WCF 服务方法包装在一个 switch 语句中,这样我就可以使用正确的 T 类型调用 UpdateCacheEntryItem 方法。由于无法从 Type 转换为通用 T 运算符,因此这是唯一的选择。由于我在缓存中没有那么多类型,因此效果很好。 (另一种解决方案是使用如下所述的接口(interface),但它不会像我想要的那样强类型化。)

    [OperationContract]
public void UpdateCacheEntryItem(CacheKey cacheKey, int id)
{
switch (cacheKey)
{
case CacheKey.UserProfile:
CacheProvider.UpdateCacheEntryItem<UserProfile>(cacheKey, id);
break;
case CacheKey.CommissionConfig:
CacheProvider.UpdateCacheEntryItem<CommissionConfig>(cacheKey, id);
break;
case CacheKey.CustomerQuickSearch:
CacheProvider.UpdateCacheEntryItem<CustomerQuickSearch>(cacheKey, id);
break;
default:
throw new Exception("Invalid CacheKey");
}

感谢大家的帮助,你们太棒了!

最佳答案

“动态声明变量”的想法与将类型作为变量声明的一部分的整点相反。这个想法是你可以告诉编译器类型,这样它就可以检查你在做什么。在这种情况下,您根本没有表达任何关于类型的信息。您也可以将 myVar 声明为 object 类型;这基本上等同于说“我对 myVar 的值几乎一无所知,除了它是一个引用。”

当然,如果您有一个通用接口(interface),那就太好了——然后您就可以安全地使用该接口(interface)的成员(当然,在创建/获取适当的实例之后)。但除此之外,除非您在编译时了解有关该类型的一些,否则您实际上无能为力。

在 C# 4 中,您可以将变量声明为 dynamic 类型,这将使​​所有绑定(bind)成为动态的 - 基本上您可以用它做任何您想做的事情,并且所有这些都将在执行时间处理时间。不过,我建议尽可能使用静态类型,这样可以在编译时捕获错误。

关于c# - 类型 T 的动态通用声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1516385/

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