.NET Framework 2.0 的实际源代码可在 Internet 上找到(用于教育目的):http://www.microsoft.com/en-us/download/details.aspx?id=4917
这是 C# 语言实现。您可以使用 7zip 解压缩它。你会在这里(相对地)找到反射命名空间:
.\sscli20\clr\src\bcl\system\reflection
我正在研究您所询问的具体实现,但这是一个好的开始。
更新:抱歉,我认为这是一条死胡同。 Type.GetType() 调用来自 System.Object 的基本实现。如果您检查该代码文件 (.\sscli20\clr\src\bcl\system\object.cs),您会发现方法是 extern(请参见下面的代码)。进一步检查可以发现实施,但它不在 BCL 中。我怀疑它会在某个地方出现在 C++ 代码中。
// Returns a Type object which represent this object instance.
//
[MethodImplAttribute(MethodImplOptions.InternalCall)]
public extern Type GetType();
更新(再次):我深入挖掘并在 CLR 虚拟机本身的实现中找到了答案。 (它在 C++ 中)。
第一块拼图在这里:
\sscli20\clr\src\vm\ecall.cpp
这里我们看到了将外部调用映射到 C++ 函数的代码。
FCFuncStart(gObjectFuncs)
FCIntrinsic("GetType", ObjectNative::GetClass, CORINFO_INTRINSIC_Object_GetType)
FCFuncElement("InternalGetHashCode", ObjectNative::GetHashCode)
FCFuncElement("InternalEquals", ObjectNative::Equals)
FCFuncElement("MemberwiseClone", ObjectNative::Clone)
FCFuncEnd()
现在,我们需要去寻找ObjectNative::GetClass ...这里是:
\sscli20\clr\src\vm\comobject.cpp
这里是GetType的实现:
FCIMPL1(Object*, ObjectNative::GetClass, Object* pThis)
{
CONTRACTL
{
THROWS;
SO_TOLERANT;
DISABLED(GC_TRIGGERS); // FCallCheck calls ForbidenGC now
INJECT_FAULT(FCThrow(kOutOfMemoryException););
SO_TOLERANT;
MODE_COOPERATIVE;
}
CONTRACTL_END;
OBJECTREF objRef = ObjectToOBJECTREF(pThis);
OBJECTREF refType = NULL;
TypeHandle typeHandle = TypeHandle();
if (objRef == NULL)
FCThrow(kNullReferenceException);
typeHandle = objRef->GetTypeHandle();
if (typeHandle.IsUnsharedMT())
refType = typeHandle.AsMethodTable()->GetManagedClassObjectIfExists();
else
refType = typeHandle.GetManagedClassObjectIfExists();
if (refType != NULL)
return OBJECTREFToObject(refType);
HELPER_METHOD_FRAME_BEGIN_RET_ATTRIB_2(Frame::FRAME_ATTR_RETURNOBJ, objRef, refType);
if (!objRef->IsThunking())
refType = typeHandle.GetManagedClassObject();
else
refType = CRemotingServices::GetClass(objRef);
HELPER_METHOD_FRAME_END();
return OBJECTREFToObject(refType);
}
FCIMPLEND
最后一件事,GetTypeHandle 的实现以及其他一些支持功能可以在这里找到:
\sscli20\clr\src\vm\object.cpp