2016-07-15 85 views
-2

我有一个包含字符串作为关键字和对象作为抽象类中的值的字典。 我有两个派生自这个抽象类的类。InvalidCastException当转换为定义类型C#

其中一个派生类可以完美工作,所有配置和项目都可以在没有问题的情况下加载和检索。 但是,其他班级让我头疼。

当我尝试获取“域”类型的对象;我得到一个无效的转换异常,但我将这个值作为上述类型添加到字典中。

下面是代码:

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

关于如何解决此问题的任何想法,和/或这是为什么不摆在首位的工作,但它的工作原理就像琴弦,一个布尔变量魅力,整型?

+0

所以你试图转换到一个'域'对象?什么是'configs',并且在你尝试演员之前它给了你什么样的价值?我猜这是一个字符串或简单的值类型。 – DavidG

+0

configs是一个字典,如OP所述。 在UserDomainConfig类中可以看到,我添加了一个键/值对,其中的值是一个Domain对象。 因此,Dictionary中只有Domain对象,但是我无法从对象(这是将值保存为什么)转换回Domain对象。 – SimonC

+1

您是否尝试过调试?输出变量的确切类型是什么? –

回答

1

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) }!"); 

这样你可以验证你的声明,两种类型是相同的。