DictionaryExtension,仅适用于单个项目,但不适用于List ,为什么和如何?

问题描述 投票:0回答:2

为了方便起见,我正在尝试从字典扩展方法中获得两个不同的返回值。第一个是RealType的项目,另一个是List<RealType>

问题/问题是这样:获得单个RealType项就像一个超级按钮,使List崩溃并要求IConvertable实现。是否没有内置电话可以转换完整列表?

Edit:我试图从Base Class转换为Derived Class,而不是相反。另外,我100%知道数据将为Derived Class类型,并且调用方每次都传递正确的类型,而没有任何出错的机会。

为什么?如果没有“肮脏”的技巧,我可以避免吗?大约有两打RealType-所有类均从MyAbstractModel扩展并保存在List<Dictionary<string, MyAbstractModel>。编写一个用于两次转换的代码似乎不是一个好主意,但似乎也有一个肮脏的(?)小技巧。

考虑以下(有效的)DictionaryExtension类

public static class DictionaryExtenders
{
    public static T GetItem<T>(this Dictionary<string, MyAbstractModel> instance, string key)
    {
        return (T)Convert.ChangeType(instance[key], typeof(T));
    }
}

这样叫:RealType item = myDictionary.GetItem<RealType>("choosenIDString");

Edit:每个词典可以并且将永远只有一个类型。一个中将永远不会存储两种不同的类型。是的,此代码将允许这样做并产生错误,但是在这种情况下不需要保护程序,这也不是我的问题的一部分。

现在,以下GetList<RealType>扩展要求使用IConvertable实现:

public static List<T> GetList<T>(this Dictionary<string, MyAbstractModel> instance)
{
    return (List<T>)Convert.ChangeType(instance.Values.ToList(), typeof(List<T>));
}

我感觉我在这里丢失了一些东西,因为以下解决方法也返回List<RealType>,但不要求IConvertable。我只是循环字典,每次都调用GetItem<T>()

public static List<T> GetList<T>(this Dictionary<string, MyAbstractModel> instance)
{
    var temp = new List<T>();
    foreach (RealType myType in instance.Values.ToList())
    {
        temp.Add(instance.GetItem<T>(myType.ID));
    }
    return temp;
}

这似乎不是一个可靠的解决方案,但可以解决。我在这里想念什么?列表是否由于语法错误而给我带来麻烦,还是有我必须理解的原因?

c# .net dictionary
2个回答
0
投票

您的GetList实现无效。字典中的所有值都是从MyAbstractModel派生的类的实例,但是您不能在所有情况下都将其相互强制转换。例如,ModelAModelB都从MyAbstractModel派生。但是您不能将ModelA强制转换为ModelB。您可以这样写:

public static List<T> GetList<T>(this Dictionary<string, MyAbstractModel> instance) where T: MyAbstractModel
{
    return instance.Values.OfType<T>().ToList();
}

在这种情况下,您将收到所有特定类型为T的值。


0
投票

您可以尝试这种方式

public static List<T> GetList<T>(this Dictionary<string, yourModel> instance)
{
    return instance.Values.Select(d => (T)Convert.ChangeType(d, typeof(T))).ToList();
}
© www.soinside.com 2019 - 2024. All rights reserved.