明确指定泛型类型C#

时间:2014-12-18 16:52:31

标签: c# generics types explicit

我想迭代泛型类型的属性,可能看起来像这样:

Class A
{
    public List<int> example1 { get; set; }
    string example2 { get; set; }
}

上面的intstring类型也可能是任何其他值或引用类型,我使用下面的代码来完成工作,但它显示错误:

  

无法从用法推断出方法'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
                }
            }
        }
    }

非常感谢任何帮助, 感谢

1 个答案:

答案 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)); 
                }
            }

        }
    }