C# 用C语言创建通用词典#

C# 用C语言创建通用词典#,c#,C#,我试图添加一个键值对,键值是字符串,值是类。整个过程就是通过一个通用方法进行访问。因此,当我基于键进行搜索时,我会在字典中得到类值。但不幸的是,我编写的代码编译后给出了以下错误。TokenizeCardViewModel“”是一种类型,在给定上下文中无效 所以当我这样做的时候: bool value=CreditCardDetailPathCollection()。包含(子路径值) 我应该知道是真是假。这样我以后可以使用dictional的值来创建类的实例 private Dictionary&

我试图添加一个键值对,键值是字符串,值是类。整个过程就是通过一个通用方法进行访问。因此,当我基于键进行搜索时,我会在字典中得到类值。但不幸的是,我编写的代码编译后给出了以下错误。TokenizeCardViewModel“”是一种类型,在给定上下文中无效

所以当我这样做的时候:

bool value=CreditCardDetailPathCollection()。包含(子路径值)

我应该知道是真是假。这样我以后可以使用dictional的值来创建类的实例

private Dictionary<string,T> CreditCardDetailPathCollection<T>() where T:class
{
   return new Dictionary<string,T>
   { 
      { "tokenize-card", TokenizeCardViewModel } 
   };
}
private Dictionary CreditCardDetailPathCollection(),其中T:class
{
返回新词典
{ 
{“tokenize卡”,TokenizeCardViewModel}
};
}
试试这段代码

private Dictionary<string, T> CreditCardDetailPathCollection<T>() where T : class
    {
        var obj = Activator.CreateInstance<T>(); 
        return new Dictionary<string, T>
        { 
            { "tokenize-card", obj } 
        };
    }
private Dictionary CreditCardDetailPathCollection(),其中T:class
{
var obj=Activator.CreateInstance();
返回新词典
{ 
{“令牌化卡”,obj}
};
}
下面的代码将创建T的实例

var obj = Activator.CreateInstance<T>();
var obj=Activator.CreateInstance();
这样,您只需要像这样调用CreditCardDetailPathCollection方法

var dict = CreditCardDetailPathCollection<TokenizeCardViewModel>();
var dict=CreditCardDetailPathCollection();

好的,让我们看看我是否理解这个问题

  • 您有一个K/V对,它实际上是一个
    字符串
    /
    类型
  • 给定一个
    ,将返回一个
    类型
  • 给定
    类型
    ,现在可以创建此类型的实例
  • 下面是一些可能会有帮助的代码

    注意:我也做了这个,所以你可以看到它的行动

    var myTypes = new Dictionary<string, Type>(StringComparer.OrdinalIgnoreCase);
    myTypes.Add("Leia", typeof(User));
    
    ...
    
    if (!myTypes.ContainsKey(key))
    {
        Console.WriteLine($"Dictionary failed to contain the key: {key}");
        return;
    }
    
    var myType = myTypes[key];
    Console.WriteLine($"Found the type: ${myType.ToString()}.");
    
    try
    {
        var something = Activator.CreateInstance(myType);
    }
    catch (Exception exception)
    {
        Console.WriteLine($"Failed to create an instance of {myType.ToString()}. Why? Error Message: {exception.Message}");
    }
    
    var myTypes=新字典(StringComparer.OrdinalIgnoreCase);
    添加(“Leia”,typeof(User));
    ...
    如果(!myTypes.ContainsKey(键))
    {
    WriteLine($“字典无法包含键:{key}”);
    返回;
    }
    var myType=myTypes[key];
    WriteLine($“找到类型:${myType.ToString()}”);
    尝试
    {
    var something=Activator.CreateInstance(myType);
    }
    捕获(异常)
    {
    Console.WriteLine($”未能创建{myType.ToString()}的实例。为什么?错误消息:{exception.Message}”);
    }
    

    现在,假设您希望动态创建实例的类有一个
    默认构造函数

    不完全清楚您要做什么。您可能需要创建一个新实例
    新的TokenizeCardViewModel()
    但除非
    TokenizeCardViewModel
    是从T派生的,否则您仍然会遇到问题。已尝试但出现错误。无法从TokenizeCardViewModel转换为我上一条评论中提到的。你能解释一下你想要达到什么目的,以便能提供适当的帮助吗?我知道你正在尝试创建通用词典。我不明白的是
    {“tokenize card”,TokenizeCardViewModel}
    如何在您想要做的事情中发挥作用。使用
    new()
    约束也应该起作用。允许使用
    new T()
    而不是使用activator。@Nkosi尝试了以下错误:无法创建变量类型“T”的实例,因为它没有新的(0)约束。是否包含约束
    其中T:class,new()
    虽然这样做了……但……我不确定OP是否会在这里尝试实现这一点。让
    CreditCardDetailPathCollection()
    返回一个字典,其中该类型的对象位于键
    标记卡