【问题标题】:Error using Action(T, object)使用 Action(T, object) 时出错
【发布时间】:2018-04-06 06:50:07
【问题描述】:

我正在调试别人的源代码,我不太确定它是如何工作的,所以有点卡住了。

这段代码:

List<string> source = new List<string>();
for (int ordinal = 0; ordinal < dbDataReader.FieldCount; ++ordinal)
    source.Add(dbDataReader.GetName(ordinal));
var list = source.Select(n => new {
                                    n = n,
                                    prop = props.FirstOrDefault<DB.PropInfo<T>>((Func<DB.PropInfo<T>, bool>)(p => string.Equals(p.Name, n, StringComparison.Ordinal)))
                                    ?? props.FirstOrDefault<DB.PropInfo<T>>((Func<DB.PropInfo<T>, bool>)(p => string.Equals(p.Name, n, StringComparison.OrdinalIgnoreCase)))
                                  }
                        )
                 .Select(param0 => new { Name = param0.n, Property = param0.prop })
                 .ToList();

while (dbDataReader.Read())
{
    T instance = Activator.CreateInstance<T>();
    foreach (var data in list)
        data.Property.Setter(instance, Convert.ChangeType(dbDataReader[data.Name], data.Property.Type)); // ERROR HERE
    objList.Add(instance);
}

抛出此异常:

ArgumentException:静态属性需要空实例,非静态属性需要非空实例。 参数名称:属性

变量instancedata 都有看起来像有效值的东西。

请问这里有什么问题?

【问题讨论】:

  • 您的列表中似乎包含了 static 属性。如果它不受欢迎,请将其过滤掉。如果是,则需要将null 传递给setter 而不是instance
  • data.Property 是私有类 PropInfo { public string Name { get;放; } public Action Setter { get;放; } 公共类型类型 { 获取;放; } } 所以不是静态的。
  • 传递 null 而不是实例产生:错误 CS1503:参数 1:无法从 '' 转换为 'T'
  • 似乎在内部,您的Action&lt;T, object&gt; 正在调用PropertyInfo.SetValue。同样,对于static 属性,您必须传递null 而不是instance。你的Action&lt;T, object&gt; 怎么样?

标签: c# argumentexception


【解决方案1】:

好的,所以我发现了问题。 它实际上是在 Setter 本身内 - 我得到的代码不是最新版本...... ;-( 谢谢大家的建议。

【讨论】:

    【解决方案2】:

    快速的脏修复怎么样?

    foreach (var data in list)
    {
        try
        {
            data.Property.Setter(instance, Convert.ChangeType(dbDataReader[data.Name], data.Property.Type));
        }
        catch(ArgumentException e)
        {
            data.Property.Setter(default(T), Convert.ChangeType(dbDataReader[data.Name], data.Property.Type));
        }
    }
    

    【讨论】:

    • 传递 null 而不是实例产生:错误 CS1503:参数 1:无法从 '' 转换为 'T'
    • 您可以在通用代码中使用 default(T) 而不是 null。
    • 也许您可以将 where T:class 子句添加到泛型方法/类的定义中。这应该允许您使用 null。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多