强制转换为定义的C#类型时发生InvalidCastException

西蒙·C

我有一个Dictionary,其中包含字符串作为键,而对象则作为抽象类中的值。我有两个从该抽象类派生的类。

派生类之一可以完美工作,所有配置和项目都可以毫无问题地加载和检索。但是,另一堂课让我头疼。

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

这是代码:

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;
    }

尽管它像字符串,布尔值和整数的魅力一样工作,但有关如何解决此问题和/或为什么一开始不起作用的任何想法?

马丁·穆德(Martin Mulder)

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

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

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

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

这样,您可以验证两种类型相同的主张。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将对象类型强制转换为自定义类时发生System.InvalidCastException

强制转换为OrganizationServiceContext时发生InvalidCastException

显式强制转换为定义的类型将抛出InvalidCastException

在C#中强制转换为反射类型

在C#中强制转换为任何类型的泛型

强制转换为较小类型时,C ++会截断

将用户定义的类型强制转换为char *时会发生什么情况?

将String转换为Double C#时发生异常

为什么会收到“ InvalidCastException:指定的强制转换无效”。尝试将Type转换为接口时

COM对象C#将MMDeviceEnumerator转换为IMMDeviceEnumerator InvalidCastException

C#强制转换泛型类型(如C ++用户定义的转换)

尝试将Object强制转换为MapEntry时发生ClassCastException

通过反射将Collection <T>转换为ObservableCollection <T>时发生InvalidCastException

当 T 定义为数组时,如何将对象数组强制转换/转换为泛型类型 T?

C#使用类型参数将对象强制转换为类

C#表达式强制转换为派生类型

在C#中将泛型强制转换为另一种类型

将CType转换为C#时,无法将类型'string'隐式转换为'string []'

如何在C#中将RetrieveEntityUsingPointQueryAsync的结果强制转换为自定义tableEntity?

强制将C#强制转换为通用

为什么在c#中将对象强制转换为具有相同值的T类型的对象时,识别的对象不相同?

将部分json转换为c#对象时发生类型为'Newtonsoft.Json.JsonReaderException'的第一次机会异常

在强制转换为不同类型时扩展元组参数

强制转换为泛型类型时的Java警告

将类型强制转换为结构指针时出错

动态转换为接口时出现InvalidCastException

在C#中强制转换为“ int”时,“ const float”值与“ float”不同

尝试锁定到导航视图控制器时发生错误,无法强制将“ UIViewController”类型的值转换为“ UINavigationController”类型

C# InvalidCastException:指定的强制转换对 JSON.Net 无效