我有 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 参数是一个字符串,例如“名词”。我使用此方法根据此字符串获取类型:
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 结构来创建不同的对象来检查 type 变量,但这不是一个优雅的解决方案。有更好的想法吗?
最佳答案
您可以使用 Activator.CreateInstance
创建类型的实例。参见 https://msdn.microsoft.com/en-us/library/wccyzw83(v=vs.110).aspx
var myword = Activator.CreateInstance(wordType);
然后您可以使用反射设置其属性,或将其强制转换为基类 MyWord
.
或者您可以在 wordType
上使用反射找到它的构造函数并调用它。
但实际上,是否有那么多单词类型使维护 Dictionary<string,Func<string, string, WordType>>
变得不那么容易(而且快得多)?在那里你可以查找一个词类型并从它的 word
中得到一个为你创建一个的函数。和 definition
值(value)观?
wordFactories["noun"](word, definition);
另一种选择是使用 Impromptu.Interface
来自 Nuget,它可以将任何动态对象包装在一个接口(interface)中并让它表现得像那样。在我的 .NET 自然语言引擎中,这就是我用来从数据库中获取单词然后将其包装为一个 INoun
的工具。 , 一个 IPluralNoun
, 一个 IMammal
等
关于C# 将对象转换为存储在字符串变量中的另一种类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33319535/