无法访问通用列表项的属性

时间:2015-05-08 22:50:25

标签: c# .net

您好我访问已将参数传递给函数的通用列表的属性时出错。我的代码如下:

程序

static void Main(string[] args)
{
    var stregsystem = new Stregsystem();
}

类用户

public int UserID = 10;

类Stregsystem

List<User> users = new List<User>();

public Stregsystem() {
    users.Add(new User());
    users.Add(new User());
    users.Add(new User());

    CSV.Write<User>(users);
}

类CSV

public static void Write<T>(List<T> list) {
    Console.WriteLine(list.Count());

    Console.WriteLine(list[0].UserID);
}

我收到以下错误:

  

错误1&#39; T&#39;不包含&#39; UserID&#39;的定义并且没有扩展名&gt;方法&#39; UserID&#39;接受第一个类型&#39; T&#39;可以找到(你是否>缺少using指令或汇编引用?)&gt; D:\ Development \ OOP \ CSV.cs 14 39 OOP

我认为错误在于写入功能,但我不知道问题是什么。

3 个答案:

答案 0 :(得分:6)

Write是一种通用方法。按原样编写,您可以使用任何类型T调用它。你当然不能假设任何类型都有属性UserId。这样做:

public static void Write(List<User> list) 
{
    Console.WriteLine(list.Count);
    Console.WriteLine(list[0].UserID);
}

答案 1 :(得分:1)

由于您将方法设为通用

,因此出现此错误
public static void Write(List<User> list) 
{
    Console.WriteLine(list.Count);
    Console.WriteLine(list[0].UserID);
}

答案 2 :(得分:0)

要访问T的属性,我们需要使用Reflection,因为我们不知道有关T的详细信息(即List)

 public void WriteData<T>(ref ExcelWorksheet workSheet,List<T> list)
    {

        workSheet.TabColor = System.Drawing.Color.Black;
        workSheet.DefaultRowHeight = 12;
        //Header of table  
        //  
        workSheet.Row(1).Height = 20;
        workSheet.Row(1).Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;
        workSheet.Row(1).Style.Font.Bold = true;
        ...
        ...
        ...


        foreach(T item in list)
        {
            System.Reflection.PropertyInfo[] propertyInfo = item.GetType().GetProperties();

            int cellIndex = 1;
            workSheet.Column(cellIndex).AutoFit();
            foreach (System.Reflection.PropertyInfo info in propertyInfo)
            {
                object value = info.GetValue(item, null);
                workSheet.Cells[recordIndex, cellIndex++].Value = value;
            }

            recordIndex++;
        }
    }