有没有办法沿着这些方向做点什么?
interface Iface
{
[anytype] Prop1 { get; }
[anytype] Prop2 { get; }
}
class Class1 : Iface
{
public string Prop1 { get; }
public int Prop2 { get; }
}
class Class2 : Iface
{
public int Prop1 { get; }
public bool? Prop2 { get; }
}
我不关心属性的类型,我只需要可用的属性。这不必使用接口实现,只需使用它作为示例。
答案 0 :(得分:25)
使界面通用:
interface Iface<T1,T2>
{
T1 Prop1 { get; }
T2 Prop2 { get; }
}
或者,创建object
类型的属性:
interface Iface
{
object Prop1 { get; }
object Prop2 { get; }
}
如果您使用的是.NET 4.0,您甚至可以创建dynamic
类型的属性:
interface Iface {
dynamic Prop1 { get; }
dynamic Prop2 { get; }
}
答案 1 :(得分:5)
使用object
或通用Iface<TValue1,TValue2>
答案 2 :(得分:3)
您必须使用对象或提供通用接口。
通用版本如下:
interface IFace<T1, T2>
{
T1 Prop1 { get; }
T2 Prop1 { get; }
}
这将让实现类型为它们提供它想要的任何类型的属性,但缺点是无论何时接受接口,您都需要指定这两种类型:
public void DoSomething(IFace<int, string> sadFace)
...
这通常是有问题的,至少非常有限,它可以通过为接口提供基本接口来“解决”,其中两个属性都可用于object
返回类型。
我认为最好的解决方案,不用重新思考你的方法就是定义一个接口IFace:
interface IFace
{
object Prop1 { get; }
object Prop1 { get; }
}
然后在你的类中实现接口显式,如下所示:
class MyClass: IFace
{
public string Prop1 { get; }
public int Prop2 { get; }
object IFace.Prop1 { get; }
object IFace.Prop1 { get; }
}
这将允许知道对象属于MyClass
类型的用户按其实际类型引用Prop1
和Prop2
,使用IFace
的任何内容都可以使用返回类型为object
。
我自己使用的东西看起来像最后一段代码,甚至是上面的“基础接口通用接口”版本,但这是一个非常专业的场景,我不知道我是否能够解决它任何其他方式。
答案 3 :(得分:1)
这相当违背了界面的目标,并且会违反C#的严格打字,即使是动态也不会帮助你,我担心。答案是我不相信。
答案 4 :(得分:1)
不是,但你可以这样做:
interface Iface<TType1, TType2>
{
TType1 Prop1 { get; }
TType2 Prop2 { get; }
}
然而,Iface<string, int>
和IFace<int, bool?>
将是不同的类型。 (即,您的Class1
&amp; Class2
没有通用界面
答案 5 :(得分:1)
我不知道您的使用场景,但您可以通过显式实现接口来实现此目的。注意:您当前的实现使您无法为这些属性赋值,因此您可能希望向类属性添加私有或受保护的set访问器。
interface Iface
{
object Prop1 { get; }
object Prop2 { get; }
}
class Class1 : Iface
{
public string Prop1 { get; }
public int Prop2 { get; }
object Iface.Prop1
{
get { return Prop1; }
}
object Iface.Prop2
{
get { return Prop2; }
}
}
class Class2 : Iface
{
public int Prop1 { get; }
public bool? Prop2 { get; }
object Iface.Prop1
{
get { return Prop1; }
}
object Iface.Prop2
{
get { return Prop2; }
}
}
答案 6 :(得分:1)
使用对象。 如果你能提供一个使用它的场景,人们可以给出更好的答案。