【发布时间】: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:静态属性需要空实例,非静态属性需要非空实例。 参数名称:属性
变量instance 和data 都有看起来像有效值的东西。
请问这里有什么问题?
【问题讨论】:
-
您的列表中似乎包含了
static属性。如果它不受欢迎,请将其过滤掉。如果是,则需要将null传递给setter 而不是instance -
data.Property 是私有类 PropInfo
{ public string Name { get;放; } public Action Setter { get;放; } 公共类型类型 { 获取;放; } } 所以不是静态的。 -
传递 null 而不是实例产生:错误 CS1503:参数 1:无法从 '
' 转换为 'T' -
似乎在内部,您的
Action<T, object>正在调用PropertyInfo.SetValue。同样,对于static属性,您必须传递null而不是instance。你的Action<T, object>怎么样?
标签: c# argumentexception