我有几个类(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 {}
虽然这需要您控制实例的创建,实例需要是 c1d
、c2d
、c3d
类型,won如果您获得 c1
、c2
或 c3
您可以像@David 指出的那样进行显式类型转换(这是一个聪明的技巧),但这意味着您将拥有对象的两个实例。对于像问题中提到的这样一个非常简单的案例,它可能会做......如果你需要更高级的东西,那可能会非常棘手
关于c# - 接口(interface)类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39038536/