为什么不能通过泛型类型访问成员?

Why members cannot be accessed by generic type?

我不明白我在尝试从泛型 T 访问 class 的成员时做错了什么。我还专门使用了 WHERE 约束。 我收到以下消息:'T' 是类型参数,在当前上下文中无效。

class Test
{
    public static int id = 1;
    public int GetId()
    {
        return id;
    }
}

public class TestUsage
{
    public int IncrementId<T>() where T : Test
    {
        return 1 + T.GetId();
    }
}

您没有提供 T 的实例。尝试:

public int IncrementId<T>(T t) where T : Test
{
    return 1 + t.GetId();
}

将方法声明为泛型意味着您可以传递泛型类型的参数。所以你可以这样做:

public class TestUsage
{
    public int IncrementId<T>(T test) where T : Test
    {
        return 1 + test.GetId();
    }
}

通用类型参数 T 没有任何意义,除非具有该类型的东西被用作输入参数、return 值、T 类型的变量方法,或某种组合。

因为在 public int IncrementId<T>(T test) 中类型参数 T 可以是任何类型,C# 不知道该类型有哪些成员。您可以添加泛型类型约束。一种方法是定义一个接口,类型必须实现该接口才能用作类型参数。

public interface IHasId
{
    int GetId();
}

class Test : IHasId
{
    public static int id = 1;
    public int GetId()
    {
        return id;
    }
}

public int IncrementId<T>(T item) where T : IHasId
{
    return item.GetId() + 1;
}

另一种选择是将 属性 访问器传递给方法

public int IncrementId<T>(T item, Func<T, int> getId)
{
    return getId(item) + 1;
}

你可以用

来称呼它
int nextId = IncrementId(test, t => t.GetId());

另请参阅:

  • Pass property itself to function as parameter in C#
  • 我的 answer to the question How can I find a specific element in a List? 说明您不应使用方法 GetId,而应使用 C# 中的 属性。