为了更好地解释它,我有一个对象具有接口类型的属性,可以携带各种不同的对象。
public class RequestParameters {
public IRequest Request { get; set; }
}
说界面看起来像这样:
public interface IRequest {
string Username { get; set; }
string Password { get; set; }
}
现在收到 RequestParameters 对象后,我想从请求属性中的对象获取属性 PersonId 的值。接口不会也不应该包含此属性,因为并非所有Request类型都具有该属性。我不知道 Request 对象中的几十种类型中的哪一种,因此强制转换不是解决方案。
那么在这种情况下如何才能获取属性 PersonId ?我想某种反思是唯一的方法,但它究竟能做到什么呢?
答案 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() {}
}