首页 > 解决方案 > 将接口用作方法的泛型参数时,如何访问具体接口实现的值

问题描述

我正在尝试为一个项目实现一些通用模型,我需要每个模型来保存一个 ICountryInformation 的值类型。根据实施的国家/地区,此接口将具有不同的值。

然而,我挣扎的是如何以正确的方式实际使用它。例如,给定一个方法:

DoSomething(ICountryInformation info) 
{
}

假设我已经解析了一个名为 ICountryInformation 的具体实现,GermanyInformation那么我希望能够在我的DoSomething()方法中获取与 ICountryInformation 的具体实例相关的信息。

但我似乎无法弄清楚如何解决 ICountryInformation 没有实现它的 GermanyInformation 类的具体值这一事实。

我如何访问 GermanyInformation 的值,当它被解析为 ICountryInformation 时,实际上必须将其转换为方法内的值?甚至可能吗?

标签: c#generics

解决方案


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到所需的国家/地区信息。它引用特定国家信息的对象,您不能将其更改为另一个国家。

接口本身不是对象。这是一个类可以实现的契约。然后,您可以通过界面以中立的方式访问它的成员,而不必知道它与哪个国家/地区相关。


推荐阅读