【问题标题】:cannot implicitly convert System.Type to object无法将 System.Type 隐式转换为对象
【发布时间】:2015-01-22 09:05:16
【问题描述】:

我正在尝试使用通用方法在 .NET C# 中加载表单设置,其中每个设置都将包含它自己的 try catch 块(当单个设置无效时继续其他设置)。但是我无法弄清楚如何解决将 appsetting 分配给对象的问题。编译器不允许我隐式转换对象的类型。

private void LoadFormSettings(object o)
{
  try
  {
    //Load settings when application is started
    Type t = o.GetType();

    // Operator '<' cannot be applied to operands of type 'method group' and 'System.Type'
    o = getAppSetting<o.GetType()>("Setting");
    // Cannot implicitly convert type 't' to 'object'
    o = getAppSetting<t>("Setting");
    // The type arguments for method... cannot be inferred from the usage. Try specifying the type arguments explicitly
    o = getAppSetting("Setting");
  }
  catch (Exception ee)
  {
  }
}

private T getAppSetting<T>(string key)
{
  string value = config.AppSettings.Settings[key].Value;
  if (typeof(T) == typeof(Point))
  {
    string[] values = value.Split(',');
    return (T) Convert.ChangeType(value, typeof(T));
  }
}

【问题讨论】:

  • 您不能将Type 类的实例(运行时已知的值)用作泛型参数(需要在编译时已知)。您可以改为使您的方法通用。
  • 您的异常处理模式不是一个好主意。 1)您正在捕获所有异常,而不仅仅是您所期望的。 2) 首先避免抛出这些异常,例如使用TryParse

标签: c# object casting system.type


【解决方案1】:

Type 是类型,t 是实例。泛型需要类型而不是实例。你只能写F&lt;Type&gt;() 而不是F&lt;t&gt;()。在你的情况下,最好写

Type t = o.GetType();
o = getAppSetting("Setting", t);

object getAppSetting(string key, Type t)
{
  string value = config.AppSettings.Settings[key].Value;
  if (t == typeof(Point))
  {
    string[] values = value.Split(',');
    return Convert.ChangeType(value, t);
  }
}

【讨论】:

  • 非常感谢,它有效。我没有想到这个选项。
【解决方案2】:

你可以使用:

    public T GetAppSetting<T>(string value) where T : struct
    {
        string value = config.AppSettings.Settings[key].Value;
        return (T)Convert.ChangeType(value, default(T).GetType());
    }

var myBoolean = GetAppSetting<bool>("setting");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2013-06-30
    相关资源
    最近更新 更多