我有一个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;
}
尽管它像字符串,布尔值和整数的魅力一样工作,但有关如何解决此问题和/或为什么一开始不起作用的任何想法?
该Convert
班仅支持简单的类型,由.NET已知的,如Int32
,String
,DateTime
。它不支持用户定义的或复杂的类型,例如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] 删除。
我来说两句