【发布时间】: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; }
}
它被几个不同的类子分类(它们的名字是Person、Place 和Organisation)。我在List<T> 实例中存储了很多Entity 类的实例。
我有一个单独的方法,用于将不同的List<Entity<Tweet>> 实例组合在一起,将它们加入Entity.Name 并合并它们包含的List<Tweet>:
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