我有MyWord类以及从MyWord继承的许多其他类,例如Noun,Idiom等。我将这些对象存储在一个列表中:List<MyWord> Dictionary;当我向列表中添加新元素时,我会这样:var myWord = new MyWord(id, word, definition,type,DateTime.Now.ToShortDateString());Dictionary.Add(myWord);如您所见,我在其中放置了MyWord对象。我希望能够创建例如Noun对象并将其放入列表中,如下所示:var myWord = new Noun(id, word, definition, type, DateTime.Now.ToShortDateString());Dictionary.Add(myWord);type参数是字符串,例如“ noun”。我使用此方法基于此字符串获取Type: private Type GetFullType(string myType) { //Returns list of all types that inherit from MyWord class var supportedTypes = (AppDomain.CurrentDomain.GetAssemblies() .SelectMany(assembly => assembly.GetTypes()) .Where(type => type.IsSubclassOf(typeof(MyWord)))).Select(x => x.FullName).ToList(); return Type.GetType(supportedTypes.Find(x => x.Contains_SkipWhiteSpacesIgnoreCase(myType))); }现在,我不知道如何使用GetFullType()返回值将MyWord转换为Noun。像这样: Type wordType = GetFullType(type); var myWord = new MyWord(id, word, definition, type, DateTime.Now.ToShortDateString()); Dictionary.Add((wordType)myWord);我希望我能清楚地解释自己。请注意,我可以使用If ... else结构来创建用于检查类型变量的不同对象,但这不是一个很好的解决方案。还有更好的主意吗? 最佳答案 您可以使用Activator.CreateInstance创建类型的实例。见https://msdn.microsoft.com/en-us/library/wccyzw83(v=vs.110).aspxvar myword = Activator.CreateInstance(wordType);然后,您可以使用反射或将其强制转换为基类MyWord来设置其属性。或者,您可以在wordType上使用反射来找到其构造函数并进行调用。但实际上,有很多单词类型维护一个Dictionary<string,Func<string, string, WordType>>并不容易(而且快很多),您可以在其中查找一个单词类型并获得一个功能,该功能可以通过word和值?wordFactories["noun"](word, definition);另一种选择是使用Nuget中的definition,它可以将任何动态对象包装在接口中,并使其具有相同的行为。在我的.NET自然语言引擎中,这就是我用来从数据库中提取一个单词,然后将其包装为Impromptu.Interface,INoun,IPluralNoun等的功能。
09-04 16:03