c# - 为什么泛型类型不能访问成员?
问题描述
我不明白在尝试从泛型类型 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();
}
}
解决方案
由于在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());
也可以看看:
- 将属性本身传递给 C# 中的参数
- 我对如何在列表中找到特定元素的问题的回答?说明您不应该使用方法,而应该使用 C# 中的属性。
GetId
推荐阅读
- python - Python ciscotelnet
- facebook - 如何获取我使用 Graph API 发送的所有友谊请求?
- scala - Scala Apache Spark和DataFrame select方法中的动态列列表
- python - 如何将用户名注入页脚?
- asp.net - 按文件名排序 FileInfo (DirectoryInfo)
- delphi - FireDAC TFDTable.Post 与 TFDQuery UPDATE 子句提交
- java - 使用 spring boot 属性调整 couchbase
- .net - WCF 服务连接问题 - 只有两台计算机可以连接
- node.js - 如何在 Cassandra + AWS Lambda 中处理超时
- php - Laravel - 从原始内容创建 PDF 文件 - JSON API