不管这是否是一个好主意,是否可以实现一个接口,其中执行函数知道调用对象的类型?
class A
{
private C;
public int doC(int input)
{
return C.DoSomething(input);
}
}
class B
{
private C;
public int doC(int input)
{
return C.DoSomething(input);
}
}
class C
{
public int DoSomething(int input)
{
if(GetType(CallingObject) == A)
{
return input + 1;
}
else if(GetType(CallingObject) == B)
{
return input + 2;
}
else
{
return input + 3;
}
}
}
在我看来,这是一种糟糕的编码实践(因为参数不会改变,但输出会改变),但除此之外这可能吗?
我所处的情况是我希望一些特定类型能够调用某个函数,但我不能排除对该函数的访问。
我考虑过有一个“类型”参数
DoSomething(int input, Type callingobject)
但不能保证调用对象会使用 GetType(this)(而不是 GetType(B))来欺骗 B,无论其自身类型如何。
这会像检查调用堆栈一样简单(相对简单)吗?
首先,是的,这样做是一个糟糕的主意,并且破坏了各种可靠的设计原则。如果这是开放的,您绝对应该考虑一种替代方法,例如简单地使用多态性 - 这似乎可以将其重构为非常清晰的单分派情况。
其次,是的,这是可能的。使用System.Diagnostics.StackTrace http://msdn.microsoft.com/en-us/library/system.diagnostics.stacktrace.aspx遍历堆栈;然后得到适当的StackFrame
上升一级。然后使用以下方法确定调用者是哪个方法GetMethod() http://msdn.microsoft.com/en-us/library/system.diagnostics.stackframe.getmethod.aspx在那StackFrame
。请注意,构建堆栈跟踪是一项潜在昂贵的操作,并且方法的调用者可能会掩盖事物的真正来源。
Edit:OP 的评论非常清楚地表明这可能是通用或多态方法。@devinb,您可能需要考虑提出一个新问题,提供有关您正在尝试执行的操作的更多详细信息,我们可以看看它是否适合提供良好的解决方案。
简短的版本是我最终会
有 30 或 40 个相同的功能
只是偏离一两行。 – devinb(12 秒前)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)