Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查两个不同的对象是否具有属性_C# - Fatal编程技术网

C# 检查两个不同的对象是否具有属性

C# 检查两个不同的对象是否具有属性,c#,C#,假设我们有两个类: class A { public int Prop1 { get; set; } public int Prop2 { get; set; } } class B { public int Prop2 { get; set; } public int Prop3 { get; set; } } 采用类型A或B的对象并检查是否有Prop2和返回类型为arquemnt的对象的最佳方法是什么,以及如何实现该方法,如下所示: T

假设我们有两个类:

class A

{
    public int Prop1 { get; set; }

    public int Prop2 { get; set; }


}

class B
{

    public int Prop2 { get; set; }

    public int Prop3 { get; set; }


}
采用类型A或B的对象并检查是否有Prop2和返回类型为arquemnt的对象的最佳方法是什么,以及如何实现该方法,如下所示:

 T CheckIfHasProp2<T>(T)
{
}
T检查ifhasprop2(T)
{
}

通用、动态、接口或其他不同的东西?我会选择intferace,但我不想失去其他属性。

最好的方法是了解对象的类型:)

若要向对象发出信号,表明其有能力在C#中执行某些操作,请使用接口

接口表示“可以做”的关系。它们代表着一种契约,一种必须遵守的准则

例如,如果
Prop2
是eat的能力,那么您可以创建一个
IEat
接口,并让可以eat的类继承自该接口。在下面的示例中,我将接口称为
IProp2
——您应该为接口指定有意义的名称,以描述实际行为:

interface IProp2
{
    int Prop2 { get; set; }
}
class A : IProp2
{
    public int Prop1 { get; set; }

    public int Prop2 { get; set; }


}

class B : IProp2
{

    public int Prop2 { get; set; }

    public int Prop3 { get; set; }
}
// inside main
var a = new A();
// check if it's a member, though usually you don't need this
Console.WriteLine(a is IProp2);  // true
(这与其他语言不同,比如TypeScript,继承不是名义上的,但这是另一回事)


注意,
dynamic
会起作用,但它会对类型系统起作用,这实际上意味着放弃静态类型检查语言的所有好处。对于接口,如果其中一个类没有实现它继承的接口,则会出现编译时错误。

我要指出的是,您也可以使用反射,但是如果您提前知道类型,那么接口是更好(更容易)的解决方案,这听起来像是您知道的,但问题是,如果我使用接口类型,它比这个方法的arguemnt更差,我将无法重新创建我的对象。你说的重新创建我的对象是什么意思?@kosnkov这正是类型安全性给你的。如果你有一个对象是一个接口,这就是我们所知道的。这是好的,这是类型系统为我们保证的。如果您需要使用依赖于特定类的其他方法,那么您需要显式地说:“为什么该方法需要返回相同的类型?”?它是该类型的新实例还是同一实例?也许如果你解释你为什么要这样做而不是你正在做什么,这会有所帮助,因为老实说,我觉得你只是走错了路,去解决你试图解决的任何问题。