c#如何转换泛型类型

本文关键字:转换 泛型类型 何转换 | 更新日期: 2023-09-27 18:18:57

我想转换一个字典,以便将值转换为由原始类型实现的接口;

首先:

public class DataRef<T> : IRef
{
      public int ID;
      public static Dictionary<int, T> LookUp = new Dictionary<int, T>();
}
public class Terrain : IThing
{
    ///IThing
    public ImageRef DefaultImageRef { get { return defaultImageRef; } }
    public string Name { get { return name; } }
    public string name = "unamed Terrain";
    //Other Stuff
    public TerrainType TerrainType = TerrainType.Floor;
    public ImageRef defaultImageRef = new ImageRef(typeof(Terrain));
    public ImageRef alternateImageRef = new ImageRef(typeof(Terrain));
    public int imageRef2;
}
public interface IThing
{
    ImageRef DefaultImageRef { get; }
    string Name { get; }
}

这个表达式不能编译:

(Dictionary<int,IThing>)DataRef<Terrain>.LookUp
错误:

错误15不能转换类型"System.Collections.Generic.Dictionary<int,>"来"System.Collections.Generic.Dictionary<int,> C:'Projects'MO1RPG'VSsolution'Editor'Main.cs 28 72 Editor

我想转换字典,因为我想使用它作为一个参数,被转换为"字典"有什么办法吗?

c#如何转换泛型类型

这在强制转换中是不可能的。你必须创建一本新字典。

一开始并不直观,因为你可以这样做:

Terrain dataRef = new Terrain();
IThing thing = (IThing)dataRef;

但是你不允许这样做:

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;

区别在这里解释:https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx

简单地说,Dictionary不是只读的,因此不能提供执行强制转换所需的某些保证。例如

Dictionary<string, Terrain> dict = new Dictionary<string, Terrain>();
Dictionary<string, IThing> castDict = (Dictionary<string, IThing>)dict;
castDict.Add("Rob", new DifferentThing()); // DifferentThing implements IThing

我们在这里所做的是将DifferentThing添加到字典中,该字典需要Terrain,这是一个大禁忌。为什么这是一个大忌?

因为如果有人这样做了:Terrain terr = dict["Rob"];现在我们尝试将DifferentThing存储到Terrain

您需要记住的是,强制转换对象是而不是(当然有例外)创建一个新对象,而是改变我们从外部看待它的方式。

为了从Dictionary<string, Terrain>获得Dictionary<string, IThing>,您需要创建一个定义为Dictionary<string, IThing>字典,并使用原始字典填充它。

请参阅BrianMains的答案

您可以尝试使用Cast Linq方法,但您可能需要使用通用的ToDictionary(k => k.Key, v => (IThing)v.Value);选项。