首页 > 解决方案 > 为什么泛型类型不能访问成员?

问题描述

我不明白在尝试从泛型类型 T 访问类成员时我做错了什么。我还专门使用了 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();
    }
}

标签: c#genericswhere

解决方案


由于在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());

也可以看看:


推荐阅读