C# 将 List 转换为 List

17 浏览
0 Comments

C# 将 List 转换为 List

我会非常感谢你的帮忙。我已经为此努力了很长时间。\n我可以通过创建两个单独的模型类并使用重复的属性列表来解决这个问题,但我想学习如何通过基类来实现这一点。所以,IntSensorExtSensor都是Sensor。从另一个类中,我解析了一个包含所有数据的json文件,这个方法很好用。但是,尝试调用一个返回List基类的方法,并将其强制转换为任何一个子类,这让我很头疼。我做错了什么...还是有更好的方法吗?谢谢!\nPS:这看起来可能是一个重复的问题,但我尝试了其他的解决方案,在`Repository类`中它们被标记为“//seen on other StackOverflow Posts -- fails”代码中。 \n//模型类\n

public class Device
{
    public string IP { get; set; }   
    public string Name { get; set; }
    public IList InternalSensors { get; set; }
    public IList ExternalSensors { get; set; }
}
public class Sensor
{
    public string Name { get; set; }
    public string ActualTemp { get; set; }
    public string HighTemp { get; set; }
    public string LowTemp { get; set; }
}
public class IntSensor : Sensor {}
public class ExtSensor : Sensor {}

\n//业务类——解析json\n

public class ParseJsonData
{
    public static RoomAlertModel GetRoomAlertModel(JObject jsonTree)
    {
        RoomAlertModel model = new RoomAlertModel();
        model.IP = jsonTree["ip"].ToString();
        model.Name = jsonTree["name"].ToString();
        return model;
    }
    public static List GetSensors(JToken jToken)
    {
        var sensors = new List();
        try
        {
            foreach (var item in jToken)
            {
                var s = new Sensor();
                s.Label = item["lab"].ToString();
                s.ActualTemp = item["tf"] != null ? item["tf"].ToString() : "";
                s.HighTemp = item["hf"] != null ? item["hf"].ToString() : "";
                s.LowTemp = item["lf"] != null ? item["lf"].ToString() : "";
                sensors.Add(s);
            }
        }
        catch (Exception)
        {
        }            
        return sensors;
    }
}

\n//存储库\n

public class RoomAlertRepository
    {
        internal RoomAlertModel Retreive()
        {
            var filePath = HostingEnvironment.MapPath(@"~/App_Data/RoomAlertsData.json");
            var json = File.ReadAllText(filePath);
            JObject jsonTree = JObject.Parse(json);
            var internalSensorTree = jsonTree["internal_sen"];
            var externalSensorTree = jsonTree["sensor"];
            var model = ParseJsonData.GetRoomAlertModel(jsonTree);
            var baseList = ParseJsonData.GetSensors(internalSensorTree);
            //在其他StackOverflow帖子中看到的解决方案--失败
            var iSensorsTry1 = baseList.Cast();
            //在其他StackOverflow帖子中看到的解决方案--失败
            var iSensorsTry2 = baseList.ConvertAll(instance => (IntSensor)instance);
            //在其他StackOverflow帖子中看到的解决方案--失败
            var iSensorsTry3 = baseList.OfType();
            model.InternalSensor = iSensorsTry1.ToList();
            return model;
        }
    }

0
0 Comments

在你的GetSensors方法中,你创建了基类Sensor的实例。试图将它们隐式转换为其他派生类是不可能的。你应该在该方法中使用泛型类型参数,并创建实际派生类型的实例。

像这样:(注意T参数的where子句和new约束)

public static List<T> GetSensors<T>(JToken jToken) where T : Sensor, new()
{
    var sensors = new List<T>();
    try
    {
        foreach (var item in jToken)
        {
            var s = new T();
            s.Label = item["lab"].ToString();
            s.ActualTemp = item["tf"] != null ? item["tf"].ToString() : "";
            s.HighTemp = item["hf"] != null ? item["hf"].ToString() : "";
            s.LowTemp = item["lf"] != null ? item["lf"].ToString() : "";
            sensors.Add(s);
        }
    }
    catch (Exception)
    {
    }            
    return sensors;
}

现在这样调用它:

List<IntSensor> iSensors = ParseJsonData.GetSensors<IntSensor>(internalSensorTree);

谢谢Greg!我尝试使用泛型,但没有搞对。我无法测试它,因为我在家里,但明天或下周一会测试。希望这个问题不会被删除,因为它被标记为重复问题(我不认为它是重复的)。再次感谢!

Greg,我还尝试过隐式转换,但似乎不起作用。你能给个例子吗?我无法想象我也搞错了。再次感谢!

嗯,我刚试了一下,似乎我错了:你不能用隐式转换解决这个问题。不允许对派生类进行自定义转换

谢天谢地。如果我不能解决这个问题,我就准备放弃一切了。哈哈。我无法相信我遇到了这么多麻烦。再次感谢!

0