我有一个接口和两个实现该接口的类。这些类具有泛型类型。我想从一个类的实例克隆到另一个类的实例。
interface IFoo
{
// stuff
}
class Foo<T> : IFoo
{
// foo stuff
// ifoo implementation
}
class Bar<T> : IFoo
{
// bar stuff
// ifoo implementation
}
我有一个 Foo,想要一个 Bar。 Bar 有一个复制构造函数,其参数为 IFoo。
我创建了一个扩展方法来实现克隆:
public static Bar<T> Clone<T>(this IFoo foo)
{
return new Bar<T>(foo);
}
调用该方法需要类型:
someFoo.Clone<T> ...
有没有办法通过修改扩展方法或任何其他方式在调用方法时省略声明类型,以允许实例仅传入而不关心其底层类型?
Update以下是如何使用它来更好地说明情况。
在一个方法中,我迭代一个集合并返回 IFoo 的枚举。在该方法中,我查看源集合的属性并确定 Foo 的类型。
IFoo foo = null;
string type = element.Attribute("Type").Value;
switch (type)
{
case "int":
foo = new Foo<int>();
break;
case "string":
foo = new Foo<string>();
break;
// etc
}
// other stuff
yield return foo;
调用方法有一个List。后来我从这个列表中选择单独的项目来使用,此时我想要一个 Bar 而不是 Foo。从列表中选择时,实例的类型为 IFoo,因为它们只能看到“this IFoo foo”的扩展方法。我不想将 IFoo 转换为 Foo,这需要重新声明 T 的类型。我只想让 Foo 告诉 Bar 它是什么。这可能吗?
所以你一切都好,但你希望能够使用语法
someFoo.Clone()
代替
someFoo.Clone<int>()
您希望隐含 int 而不是必须显式地将其放在那里?
您无法在代码示例中执行此操作的原因是 IFoo 没有引用创建所需的泛型类型 TBar<T>
.
我建议你确实需要另一个接口:IFoo<T>
如果你有这个,并且你的扩展方法如下所示:
public static Bar<T> Clone<T>(this IFoo<T> foo)
{
return new Bar<T>(foo);
}
那么你使用就没有问题了
IFoo<int> someFoo = new Foo<int>();
Bar<int> someBar = someFoo.Clone();
希望有帮助
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)