强制转换为定义的类型 C# 时的无效强制转换异常

本文关键字:转换 无效 异常 类型 定义 | 更新日期: 2023-09-27 17:57:14

>我有一个字典,其中包含字符串作为键,对象作为抽象类中的值。我有两个从这个抽象类派生的类。

其中一个派生类运行良好,所有配置和项目都已加载并可检索,没有问题。然而,另一堂课让我头疼。

当我尝试获取类型为"域"的对象时;我得到一个无效的强制转换异常,尽管我正在将值添加到字典中作为所述类型。

这是代码:

public sealed class UserDomainConfig: ConfigParser {
    public UserDomainConfig(string configFilePath) : base(configFilePath) { }
    public Domain GetConfig(string key) => GetConfig<Domain>(key);
    public override bool LoadConfigs() {
        return base.LoadConfigs();
    }
    public UserDomainConfig SetConfig(string key, Domain value) {
        base.SetConfig(key, value);
        return this;
    }
}

public abstract class ConfigParser: IConfig {
    /* Snip */
    /// <summary>
    /// Gets the config.
    /// </summary>
    /// <returns>The config.</returns>
    /// <param name="key">Key.</param>
    /// <typeparam name="T">The 1st type parameter.</typeparam>
    public virtual T GetConfig<T>(string key) {
        object output = null;
        try {
            if (!configs.TryGetValue(key, out output))
                return default(T);
            //return (T)output;
            //return output as T;
            // This is where the exception is occurring.
            //  I've tried multiple solutions to try to remedy this issue.
            return (T)Convert.ChangeType(output, typeof(T));
        } catch (InvalidCastException ex) {
            logger.Error($"Failed to cast config { key }!");
        }
        return default(T);
    }
    /// <summary>
    /// Sets the config.
    /// </summary>
    /// <returns>The config.</returns>
    /// <param name="key">Key.</param>
    /// <param name="value">Value.</param>
    /// <typeparam name="T">The 1st type parameter.</typeparam>
    public virtual IConfig SetConfig<T>(string key, T value) {
        if (KeyExists(key))
            configs.Remove(key);
        configs.Add(key, value);
        return this;
    }

关于如何解决这个问题的任何想法,和/或为什么这首先不起作用,尽管它就像一个带有字符串、布尔值和整数的魅力?

强制转换为定义的类型 C# 时的无效强制转换异常

Convert类仅支持简单类型,由 .NET 称为,如 Int32StringDateTime 。它不支持用户定义或复杂类型,如 Domain 。如果尝试将某些内容转换为不支持的类型,该方法Convert.ChangeType会引发InvalidCastException。唯一的例外是,如果原始值(output)已经是所需的类型,它将起作用;而不是不需要实际转换。

有关更多信息,请阅读:https://msdn.microsoft.com/en-us/library/dtb69x08(v=vs.110).aspx

如果您确定存储的值属于 Domain 类型,则记录更多信息。像这样:

logger.Error($"Failed to cast config { key } of type { output.GetType() } to type { typeof(T) }!");

通过这种方式,您可以验证两种类型相同的说法。