c# - 接口(interface)类型转换

标签 c# interface

我有几个类(class)我不能改变。它们有一个共同的属性 Prop3:

public class c1
{
    public  string Prop1 { get; set; }
    public  string Prop2 { get; set; }
    public  string Prop3 { get; set; }
}

public class c2
{
    public  string Prop2 { get; set; }
    public  string Prop3 { get; set; }
}

public class c3
{
    public  string Prop5 { get; set; }
    public  string Prop3 { get; set; }
}

现在我想在不知道类型的情况下访问这个属性。我想到了使用接口(interface):

public interface ic
{
    string Prop3 { get; set; }
}

但是这段代码抛出了一个无效的转换异常:

c1 c1o = new c1() { Prop3 = "test" };
string res = ((ic)c1o).Prop3;

最佳答案

C# 不支持编译时 duck-typing ,所以如果你不能改变你的类型,那就没有运气。

您可以使用 dynamic 访问您的属性,它允许运行时鸭子类型(虽然没有编译时检查,如果您使用 Visual Studio,您将失去 intellisense):

c1 c1o = new c1() { Prop3 = "test" };
string res = ((dynamic)c1o).Prop3;

或者通过反射:

c1 c1o = new c1() { Prop3 = "test" };
string res = (string)c1o.GetType().GetProperty("Prop3").GetValue(c1o);

由于没有编译时检查,如果您传递一个没有 Prop3 的实例,您将需要处理异常。

或者如果类型不是密封的,你可以尝试实现你自己的派生类型,你可以在其中指定一个接口(interface):

public interface ic
{
   string Prop3 { get; set; }
}

public class c1d : c1, ic {}
public class c2d : c2, ic {}
public class c3d : c3, ic {}

虽然这需要您控制实例的创建,实例需要是 c1dc2dc3d 类型,won如果您获得 c1c2c3

类型的对象,则无法工作

您可以像@David 指出的那样进行显式类型转换(这是一个聪明的技巧),但这意味着您将拥有对象的两个实例。对于像问题中提到的这样一个非常简单的案例,它可能会做......如果你需要更高级的东西,那可能会非常棘手

关于c# - 接口(interface)类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038536/

相关文章:

c# - 为什么 Path 和 Polyline 在 WPF 中有不同的渲染?

c# - 如何从后台工作线程更改 XAML 元素?

c# - 在 C# 中读取流时如何解压它

c# - 关于C#中接口(interface)使用的问题

java - java类如何扩展另一个类并同时使用相同的方法名实现接口(interface)

c# - 在 C# 中为可序列化类型创建接口(interface)?

c# - 帮助我理解来自 MSDN 的 Dispose() 实现代码

c# - 当 Delphi 类型为 "out PChar"时,我应使用什么 C# 参数类型?

c++ - C++中没有数据成员的类

c# - 使用程序安装安装 .NET Framework