【问题标题】:Dynamically creating objects in LINQ expression that inherit from abstract base class在从抽象基类继承的 LINQ 表达式中动态创建对象
【发布时间】:2014-08-01 02:22:36
【问题描述】:

我有一个抽象类:

public abstract class Entity<T> where T : Tweet
    {
        protected string _name;
        public abstract string Name { get; set; }
        public abstract List<Tweet> tweets { get; set; }
    }

它被几个不同的类子分类(它们的名字是PersonPlaceOrganisation)。我在List&lt;T&gt; 实例中存储了很多Entity 类的实例。

我有一个单独的方法,用于将不同的List&lt;Entity&lt;Tweet&gt;&gt; 实例组合在一起,将它们加入Entity.Name 并合并它们包含的List&lt;Tweet&gt;

private static List<Entity<Tweet>> joinLists(List<Entity<Tweet>> list1, List<Entity<Tweet>> list2)
{
    List<Entity<Tweet>> joined;

    joined = list1.Union(list2)
                  .GroupBy(o => o.Name)
                  .Select(o => new Entity<Tweet> // this is wrong as class is abstract but at this point I don't know what concrete class o is?
                  {
                      Name = o.Key,
                      tweets =
                          o.SelectMany(x => x.tweets).ToList()
                  }).ToList();

    return joined;
}

不幸的是,Entity 是一个抽象类,我无法创建它的实例,那么如何在 LINQ 表达式中动态确定 o 实例的实际具体类。我有一个单独的方法,它基于对象类名的字符串表示来执行此操作,但我想知道如何使用 LINQ 实现这一点(下面的方法是我在应用程序其他地方使用的实现):

private static Entity<Tweet> createEntity(string className, Tweet tweet, string value)
{
    Entity<Tweet> entity = null;
    Type t = Type.GetType("FinalUniProject.NERModels." + className);
    entity = (Entity<Tweet>)Activator.CreateInstance(t);
    entity.Name = value;
    // Allow for inverted index by adding tweet to NamedEntist List<TweetModel>
    if (entity.tweets == null) entity.tweets = new List<Tweet>();
    entity.tweets.Add(tweet);
    return entity;
}

【问题讨论】:

  • 在 linq 的 select 语句中插入 createEntity 函数的完整实现并返回 Entity 对象有什么问题
  • Activator.CreateInstance(o.GetType()),但最好使用抽象的Clone 方法...
  • 听起来你需要一个类:JoinedTweetList 什么的。

标签: c# linq generics abstract-class


【解决方案1】:

下面的代码行肯定不会给出任何编译错误。没有检查所有方面。你确定这行不通吗?

joined = list1.Union(list2)
                      .GroupBy(o => o.Name)
                      .Select(o =>
                      {
                          Entity<Tweet> entity = null;
                          string className = o.First().GetType().Name;
                          Type t = Type.GetType("FinalUniProject.NERModels." + className);
                          entity = (Entity<Tweet>)Activator.CreateInstance(t);
                          entity.Name = o.Key;
                          // Allow for inverted index by adding tweet to NamedEntist List<TweetModel>
                          entity.tweets = o.ToList().SelectMany(x => x.tweets).ToList();
                          return entity;
                      }).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-23
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    相关资源
    最近更新 更多