C#从隐藏在Interface后面的对象获取属性的值

时间:2016-12-08 11:53:06

标签: c# asp.net reflection

为了更好地解释它,我有一个对象具有接口类型的属性,可以携带各种不同的对象。

public class RequestParameters {
     public IRequest Request { get; set; }
}

说界面看起来像这样:

public interface IRequest {
     string Username { get; set; }
     string Password { get; set; }
}

现在收到 RequestParameters 对象后,我想从请求属性中的对象获取属性 PersonId 的值。接口不会也不应该包含此属性,因为并非所有Request类型都具有该属性。我不知道 Request 对象中的几十种类型中的哪一种,因此强制转换不是解决方案。

那么在这种情况下如何才能获取属性 PersonId ?我想某种反思是唯一的方法,但它究竟能做到什么呢?

2 个答案:

答案 0 :(得分:1)

创建中间界面怎么样?

public class RequestParameters
{
     public IRequest Request { get; set; }
}    
public interface IRequest {
     string Username { get; set; }
     string Password { get; set; }
}
public interface IRequestWithId : IRequest
{
    string ID {get; set; }
}

现在您可以检查该接口而不是具体类来检查是否有ID。

除此之外,只有反思在这里是一个非常糟糕的主意。在定义接口时,您希望减少代码耦合,这意味着您不希望依赖于实际类型(定义如何事情完成),而只是依赖于他们的行为(什么可以用它们完成)。当您间接依赖实际类型时,使用反射会绕过这一点。此外,使用反射对于维护是不利的,特别是在重构方法时(例如重命名)。

答案 1 :(得分:0)

首先,在c#中还有另一种叫做抽象类的类型,在我看来它更适合你的情况。看看this问题。接口并不意味着保存变量,只保存函数。

 public abstract class ARequest
 {
    string Username { get; set; }
    string Password { get; set; }

    public abstract int GetId() {}

 }