Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将一个变量转换为另一个变量的类型?_C# - Fatal编程技术网

C# 如何将一个变量转换为另一个变量的类型?

C# 如何将一个变量转换为另一个变量的类型?,c#,C#,编辑:好的,下面是我正在做的一个较长的解释: 这是一本标有“存储”的有序字典 public OrderedDictionary存储=new OrderedDictionary() { {“小饰品”,新列表{}, {“杂项设备”,新列表{}, {“头饰”,新列表{}, {“武器”,新名单{}, //等等。。。 }; 其中的“AddToStorage()”是指获取一个参数(项),该参数(项)是存储中的任何列表值类型,而无需使用“else if”测试每个潜在类型 下面是我试图做的,但我得到了错误“'

编辑:好的,下面是我正在做的一个较长的解释:

这是一本标有“存储”的有序字典

public OrderedDictionary存储=new OrderedDictionary()
{
{“小饰品”,新列表{},
{“杂项设备”,新列表{},
{“头饰”,新列表{},
{“武器”,新名单{},
//等等。。。
};
其中的“AddToStorage()”是指获取一个参数(项),该参数(项)是存储中的任何列表值类型,而无需使用“else if”测试每个潜在类型

下面是我试图做的,但我得到了错误“'ItemType'是一个变量,但被用作一个类型”:

public void AddToStorage(对象项)
{    
int指数=0;
foreach(存储中的对象存储列表)
{
if(storageList.GetType().GetGenericArguments()[0]==item.GetType())
{
Type ItemType=item.GetType();
//这就是问题所在
(存储[索引]为列表)。添加(项为ItemType);
}
索引++;
}
}

所以我显然不能像使用类型一样使用类型为“Type”的变量,因为类型为“Type”的变量是变量而不是类型。撕扯。
饰品
杂项装备
头饰
,以及
武器
听起来都应该来自一个普通的
物品
类型(或者实现一个普通的
IItem
界面)

为了参数起见,假设它们都来自
Item
。您可以修改方法以接受受约束的泛型:

public void AddToStorage<TItem>(TItem item)
    where TItem: Item, new()
{    
    var storageList = Storage.Values.OfType<List<TItem>>().Single();
    storageList.Add(item);
}
public void AddToStorage(TItem项)
其中TItem:Item,new()
{    
var storageList=Storage.Values.OfType().Single();
存储列表。添加(项);
}
使用受约束的泛型(受
约束,其中TItem:Item
),您可以找到类型为
的列表,并将您的项目添加到其中。
new()


请注意,
.Single()
要求只找到一个类型为
list
的列表,如果不是这样,则会引发异常。如果列表可能不存在,可以将其更改为
SingleOrDefault()
,并添加空检查。从我对您的场景的理解来看,情况并非如此,因此
.Single()
应该可以。

您可以为
AddToStorage
设置多个重载,并采用每种预期类型吗?是的,这永远不会起作用,您试图从根本上做些什么,以便我们可以为您指明正确的方向,更新您的问题为什么不尝试用一种通用的方式编写AddStorage方法,如
public void AddToStorage(t item)
。通过这种方式,你可以使用
T
而不是乱搞你的ItemType变量(注意!T将从传递给这样一个方法的引用/变量的类型中推断出来,而不是从对象本身的类型中推断出来)是的,我可能会这样做。一些额外的注意事项:如果你做了类似的事情:
Item x=new-wedget();…AddToStorage(x);
这里的方法将查找
列表
,而不是
列表
类型,阻止了我在这里概述的场景。因此,为了简单起见,我在问题中没有提到另一件事,但是列表中有一个由元组组成的变体,而不是直接项(其中item1是类型,item2是数量)(这适用于相互堆叠的项,因为它们在其实例中永远不会有唯一的值)即“列表”),而不是向列表中添加新对象;而是有一个函数查找元组中的相同类型(如果已添加)和“递增”项2。我是否要再创建一个“where”不知怎么回事?@也许这是另一种方法。虽然每个通用参数都有一个位置,但听起来并不象是你的用例。为了更好地解决一般问题,我想把一个项目看作是一个1的堆栈,而不是试图用不同的方法来存储非常相似的信息。
public void AddToStorage(object item)
{    
        int index=0;
        foreach (object storageList in Storage)
        {
            if (storageList.GetType().GetGenericArguments()[0] == item.GetType())
            {
                Type ItemType = item.GetType();
                //here's where the problem is 
                (Storage[index] as List<ItemType>).Add(item as ItemType);
            }
        index++;
        }
}
public void AddToStorage<TItem>(TItem item)
    where TItem: Item, new()
{    
    var storageList = Storage.Values.OfType<List<TItem>>().Single();
    storageList.Add(item);
}