【问题标题】:Convert anonymous type T to strong type将匿名类型 T 转换为强类型
【发布时间】:2015-05-16 01:31:15
【问题描述】:

如何将匿名类型 T 转换为强类型类

我有这个类,它有两个作为匿名类型 T 的 in 参数。该方法有时应该采用任何类型的参数。

我已尝试使用 var rest = pointOfSalesList.ChangeType(model, typeof(List<PointOfSaleModel>)); No errors is received 但变量 pointOfSalesList 未转换为强类型 List<PointOfSaleModel>

internal override void Load<T>(T data, List<T> model)
{
    // this does't work
    var pointOfSalesList = Convert.ChangeType(model, typeof(List<PointOfSaleModel>));
}

我想将List&lt;T&gt; model参数转换为强类型的类

internal class PointOfSaleModel : IPointOfSaleModel
    {
        public Guid PointOfSaleProviderUniqueId { get; set; }

        public string CorporateId { get; set; }

        public string Name { get; set; }

        public string Adress { get; set; }

        public int? ZipCode { get; set; }

        public string Phone { get; set; }

        public string ContactPerson { get; set; }

        public string Email { get; set; }

        public bool Status { get; set; }
    }

我已经尝试了一天来解决这个问题。

【问题讨论】:

  • 你为什么要改变类型?这看起来不是一个合适的解决方案;也许您应该将 T 更改为 IPointOfSaleModel 并删除类型参数?
  • T 不是 anonymous,它是 generic,这意味着它可以是任何类型(因为没有明确的限制)如果 @987654329 @是int?您如何将其“转换”为PointOfSaleModel
  • 你想在Load()的转换中做什么?
  • 请提供一个包含T 实际列表的示例,并解释为什么您使用select new { ... } 创建匿名类型的实例,而不是直接实例化您似乎实际需要的强类型类select new PointOfSaleModel() { ....}.
  • @eFlag "什么时候适合使用 T" 无论T 是什么,当您的方法有效时。你可以在一定程度上限制T(强制它成为一个类,实现一个特定的接口,有一个无参数的构造函数等)但是如果你的方法只适用于一种类型,那么它不是“通用的”。

标签: c# .net


【解决方案1】:

为什么不这样呢?

internal override void Load<T>(T data, List<T> model)
{

    if (data.GetType() == typeof(PointOfSaleModel))
        {
            var pointOfSalesList = model as List<PointOfSaleModel>;
        }            
}

【讨论】:

  • 您在执行 PointOfSaleModel 强制转换之前安全地检查类型
  • 这只有在 T 完全 PointOfSaleModel(而不是子类)时才有效,在这种情况下它不应该是通用的。
  • D 斯坦利。那么更好的方法是使用强类型作为参数呢?
  • @eFlag 传入的列表实际上PointOfSaleModel对象的列表吗?如果是这样,是的。
【解决方案2】:

这段代码展示了没有任何技巧但强制泛型的强制转换(注意 T:PointOfSaleModel 的位置)

class Caster
{
    internal void Load<T>(List<T> model)
        where T:PointOfSaleModel
    {

        // this should work
        var pointOfSalesList = new List<PointOfSaleModel>(model);
    }

}

class MainClass
{
    public static void Main (string[] args)
    {
        var list = new List<PointOfSaleModel> {
            new PointOfSaleModel{
                Name = "name 1"
            }
        };
        var caster = new Caster ();
        caster.Load (list);
    }
}

【讨论】:

    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    相关资源
    最近更新 更多