gpt4 book ai didi

c# - 等效接口(interface)之间的隐式转换

转载 作者:行者123 更新时间:2023-11-30 21:41:03 25 4
gpt4 key购买 nike

假设我有以下界面:

public interface IMap<S, T>()
{
T Map(S source);
}

根据我使用的通用类型参数,使用它的实现可能会变得很麻烦(即 IMap<int, IEnumerable<SomeOtherType>> )

为了在本地简化事情,我更希望能够声明一个明确命名的接口(interface)版本,例如:

public interface IMyMap : IMap<int, IEnumerable<SomeOtherType>> {}

不需要额外的方法;只是一些让使用它不那么麻烦的东西(特别是如果它归结为通过反射实例化)。

但是,如果我可以转换 IMap 的任何实现,我也更愿意具有完全相同类型参数的类型,转换为特定命名的类型。这不是 C++ Typedef,它非常适合我正在寻找的东西,这是 C#。

我可以编写一个接受任何形式的 IMap<int, IEnumerable<SomeOtherType>> 的实现, 并结束通话。不过,这似乎最终会比实现它时带来的麻烦更多。

编辑:例如,我希望按照这些思路做一些事情:

public class SomeOtherType { }
public interface IMap<S, T> { T Map(S source); }
public interface IMyMap : IMap<int, IEnumerable<SomeOtherType>> {}

public class Main
{
public Main(IMap<int, IEnumerabel<SomeOtherType>> input)
{
IMyMap wrapped = input;
}
}

显然,这种请求严重依赖于 IMyMap没有比它实现的接口(interface)更多的定义。

tehDorf 提供的解决方案在我想要的范围内;然而,我也在寻找其他可能的解决方案,例如通过包装器工作:

public class MyMapWrapper : IMyMap
{
private IMap<int, IEnumerable<SomeOtherType>> wrapped;
public MyMapWrapper(IMap<int, IEnumerable<SomeOtherType>> wrapped)
{ this.wrapped = wrapped; }

public IEnumerable<SomeOtherType> Map(int source) { return wrapped.Map(source); }
}

是否有任何其他不同的方法可以完成我正在寻找的事情?尤其是任何未归入单个文件的内容。

最佳答案

您可以添加 using alias directive (谢谢,itsme86):

using IMyMap = IMap<int, IEnumerable<SomeOtherType>>;

然后,在代码中你可以使用IMyMap,像这样:

using System.Collections.Generic;
using IMyMap = SomeExample.IMap<int, System.Collections.Generic.IEnumerable<bool>>;

namespace SomeExample
{
public interface IMap<T, S>
{
T Map(S source);
}

public class ExampleUsage
{
public IMyMap Foo { get; set; }

public void SetFoo()
{
Foo = (IMyMap) new object();
Foo = (IMap<int, IEnumerable<bool>>) new object(); // Same thing
}
}
}

不过,您必须将 using alias 指令添加到要在其中使用它的任何代码文件。

关于c# - 等效接口(interface)之间的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43904042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com