我想迭代泛型类型的属性,可能看起来像这样:
Class A
{
public List<int> example1 { get; set; }
string example2 { get; set; }
}
上面的int
和string
类型也可能是任何其他值或引用类型,我使用下面的代码来完成工作,但它显示错误:
无法从用法推断出方法'TestProject.Program.FillCodesFromId(T)'的类型参数。尝试在突出显示的行*
中明确指定类型参数
static void FillCodesFromId<T, S>(T input)
where T : new()
where S : new()
{
Type type = typeof(T);
foreach (var item in type.GetProperties())
{
Type tempType = item.PropertyType;
if (tempType is IEnumerable<S>)
{
IEnumerable<S> list = item.GetValue(input) as IEnumerable<S>;
foreach (var listItem in list)
{
if (IsClassOrStruct(listItem.GetType()))
{
FillCodesFromId(listItem); //shows error
}
}
}
else if (IsClassOrStruct(tempType))
{
FillCodesFromId(item.GetValue(input)); //shows error
}
else
{
foreach (var subItem in item.GetCustomAttributes(typeof(TestAttribute), false))
{
//do something
}
}
}
}
非常感谢任何帮助, 感谢
答案 0 :(得分:0)
你可以傻瓜&#34;编译器使用您永远不必提供的Optional Argument (在此方法中除外)
我不知道你是否接受了解决方案,但至少你不必提供这个论点......
static void FillCodesFromId<T, S>(T input, S unused = default(S))
where T : new()
where S : new()
{
Type type = typeof(T);
foreach (var item in type.GetProperties())
{
Type tempType = item.PropertyType;
if (tempType is IEnumerable<S>)
{
IEnumerable<S> list = item.GetValue(input) as IEnumerable<S>;
foreach (var listItem in list)
{
FillCodesFromId(listItem, default(S));
}
}
}
}