C# 将对象转换为存储在字符串变量中的另一种类型

标签 c# oop type-conversion

我有 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/

相关文章:

c# - 线程休眠函数无响应

java - 在 Java 中避免 RTTI

python - 如何使用 nosetests 分解 python 测试用例

javascript - 如何使构造函数参数可用于原型(prototype)函数 JavaScript

c# - 显式加载 N :M with Filtering

c# - Entity Framework Select() 隐藏数据

error-handling - 为什么 Rust 的 usize 到 u128 转换被认为是失败的?

python - 如何在函数定义中强制执行自动参数转换?

java - Java 中数组中 String 的类型转换抛出 "Unknown Source Error"

c# - 根据给定的字符串输入确定类型