c# - 将接口用作方法的泛型参数时,如何访问具体接口实现的值
问题描述
我正在尝试为一个项目实现一些通用模型,我需要每个模型来保存一个 ICountryInformation 的值类型。根据实施的国家/地区,此接口将具有不同的值。
然而,我挣扎的是如何以正确的方式实际使用它。例如,给定一个方法:
DoSomething(ICountryInformation info)
{
}
假设我已经解析了一个名为 ICountryInformation 的具体实现,GermanyInformation
那么我希望能够在我的DoSomething()
方法中获取与 ICountryInformation 的具体实例相关的信息。
但我似乎无法弄清楚如何解决 ICountryInformation 没有实现它的 GermanyInformation 类的具体值这一事实。
我如何访问 GermanyInformation 的值,当它被解析为 ICountryInformation 时,实际上必须将其转换为方法内的值?甚至可能吗?
解决方案
DoSomething
获取信息不是任务。调用时必须将其作为参数传递
DoSomeThing(new GermanyInformation());
将此信息实现为单例是有意义的。
public class GermanyInformation : ICountryInformation
{
public static readonly GermanyInformation Instance = new GermanyInformation();
// Hide the constructor
private GermanyInformation()
{
}
...
}
然后调用它
DoSomeThing(GermanyInformation.Instance);
如果您想DoSomeThing
始终使用德语信息,请删除该参数
DoSomething()
{
ICountryInformation info = GermanyInformation.Instance;
}
另一种方法是使用泛型方法或使用封闭泛型类的类型参数的方法(此处没有单例实现)
void DoSomething<T>() where T : ICountryInformation, new()
{
ICountryInformation info = new T();
}
调用它
DoSomething<GermanyInformation>();
或使用泛型类
public class CountryService<T> where T : ICountryInformation, new()
{
void DoSomething()
{
ICountryInformation info = new T();
}
}
调用它
var service = new CountryService<GermanyInformation>();
service.DoSomething();
请注意,您无法投射ICountryInformation
到所需的国家/地区信息。它引用特定国家信息的对象,您不能将其更改为另一个国家。
接口本身不是对象。这是一个类可以实现的契约。然后,您可以通过界面以中立的方式访问它的成员,而不必知道它与哪个国家/地区相关。
推荐阅读
- c - c、加号结果奇怪
- javascript - 如何解决从 Ace Editor 获得的代码值的 Brython Giving Error
- mysql - Aurora - 大表 - 是 DROP COLUMN 锁定操作
- php - 在 Mongo Laravel 中按价格排序
- sharepoint - 在 Sharepoint 目录中上传图像后,总是得到字母数字 id
- xamarin.android - 无法更改微调器 Xamarin Android 的 textSize
- c# - 如何让 Microsoft.Data.SqlClient 与 DataSet Designer 一起工作?
- javascript - 如何格式化轴标签以在 Chart.js 中显示来自 UNIX 时间戳的格式化日期
- c# - 在 Unity 中放大和缩小
- webpack - 如何在 viteJS 中使用自定义加载器处理 CSS 文件?