我有一个包含字符串作为关键字和对象作为抽象类中的值的字典。 我有两个派生自这个抽象类的类。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;
}
关于如何解决此问题的任何想法,和/或这是为什么不摆在首位的工作,但它的工作原理就像琴弦,一个布尔变量魅力,整型?
所以你试图转换到一个'域'对象?什么是'configs',并且在你尝试演员之前它给了你什么样的价值?我猜这是一个字符串或简单的值类型。 – DavidG
configs是一个字典,如OP所述。 在UserDomainConfig类中可以看到,我添加了一个键/值对,其中的值是一个Domain对象。 因此,Dictionary中只有Domain对象,但是我无法从对象(这是将值保存为什么)转换回Domain对象。 –
SimonC
您是否尝试过调试?输出变量的确切类型是什么? –