gpt4 book ai didi

c# - 在什么情况下 GetType() 方法将返回接口(interface)的类型

转载 作者:太空宇宙 更新时间:2023-11-03 13:16:10 24 4
gpt4 key购买 nike

我问这个是因为我得到了一个由 WCF 运行时生成的对象,并在其上调用 GetType() 返回接口(interface)类型。因此,如果您对 WCF 不熟悉或不感兴趣,这是一个更具体的问题。

这是我问的相关问题: why an object of WCF service contract interface can be casted to IClientChannel

最佳答案

我无法对所有可能发生这种情况的情况进行分类,但这里有一些关于这个特殊情况的信息。 CLR 有一些功能可以拦截 System.Runtime.Remoting 中的调用。特别是 RealProxy 类似乎很特别。您可以使用它包装一个对象并拦截对对象上的方法的调用。这article有许多关于如何使用/实现 RealProxy 的细节。我发现您可以使用它来拦截像 GetType 这样的方法。我怀疑 WCF 也在幕后使用动态生成的类来执行此操作。使用该文章中的一些示例进行演示:

class Program
{
static void Main(string[] args)
{
Console.WriteLine(new DynamicProxy(new Calculator(), typeof(ICalculator)).GetTransparentProxy().GetType());
}
}

public interface ICalculator
{
double Add(double x, double y);
}

class Calculator : ICalculator
{
public double Add(double x, double y)
{
throw new NotImplementedException();
}
}

class DynamicProxy : RealProxy
{
private readonly object _decorated;
private readonly Type _reportedType;
private static readonly MethodInfo GetTypeMethodInfo = typeof(object).GetMethod("GetType");

public DynamicProxy(object decorated, Type reportedType)
: base(reportedType)
{
_decorated = decorated;
_reportedType = reportedType;
}

private void Log(string msg, object arg = null)
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine(msg, arg);
Console.ResetColor();
}

public override IMessage Invoke(IMessage msg)
{
var methodCall = msg as IMethodCallMessage;
var methodInfo = methodCall.MethodBase as MethodInfo;
Log("In Dynamic Proxy - Before executing '{0}'",
methodCall.MethodName);
try
{
object result;
if (GetTypeMethodInfo.Equals(methodInfo))
{
result = _reportedType;
}
else
{
result = methodInfo.Invoke(_decorated, methodCall.InArgs);
}

Log("In Dynamic Proxy - After executing '{0}' ",
methodCall.MethodName);
return new ReturnMessage(result, null, 0,
methodCall.LogicalCallContext, methodCall);
}
catch (Exception e)
{
Log(string.Format(
"In Dynamic Proxy- Exception {0} executing '{1}'", e),
methodCall.MethodName);
return new ReturnMessage(e, methodCall);
}
}
}

关于c# - 在什么情况下 GetType() 方法将返回接口(interface)的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com