Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ruft die Einschränkungen ab, die diesem generischen Parameter zugeordnet sind.
Syntax
int GetConstraints(
uint cConstraints,
out IDebugField[] ppConstraints,
ref uint pcConstraints
);
Parameter
cConstraints
[in] Anzahl der Einschränkungen.
ppConstraints
[out] Gibt ein Array zurück, das die mit diesem Feld verknüpften Einschränkungen enthält.
pcConstraints
[in, out] Anzahl der Einschränkungen im ppConstraints Array.
Rückgabewert
Wenn die Ausführung erfolgreich ist, wird S_OK, andernfalls ein Fehlercode zurückgegeben.
Beispiel
Im folgenden Beispiel wird gezeigt, wie Sie diese Methode für ein CDebugGenericParamFieldType-Objekt implementieren, das die IDebugGenericParamField-Schnittstelle verfügbar macht.
HRESULT CDebugGenericParamFieldType::GetConstraints(
ULONG32 cConstraints,
IDebugField** ppConstraints,
ULONG32* pcConstraints)
{
HRESULT hr = S_OK;
CComPtr<IMetaDataImport> pMetadata;
CComPtr<IMetaDataImport2> pMetadata2;
mdGenericParamConstraint* rgParamConsts = NULL;
HCORENUM hEnum = 0;
ULONG cConst = 0;
ULONG iConst;
ULONG iConstOut = 0;
METHOD_ENTRY( CDebugGenericParamFieldType::GetConstraints );
IfFalseGo(ppConstraints && pcConstraints, E_INVALIDARG );
*pcConstraints = 0;
IfNullGo( rgParamConsts = new mdGenericParamConstraint[cConstraints], E_OUTOFMEMORY);
IfFailGo( m_spSH->GetMetadata( m_idModule, &pMetadata ) );
IfFailGo( pMetadata->QueryInterface(IID_IMetaDataImport2, (void**)&pMetadata2) );
IfFailGo( pMetadata2->EnumGenericParamConstraints( &hEnum,
m_tokParam,
rgParamConsts,
cConstraints,
&cConst) );
pMetadata->CloseEnum(hEnum);
hEnum = NULL;
for (iConst = 0; iConst < cConst; iConst++)
{
mdToken tokConst;
IfFailGo( pMetadata2->GetGenericParamConstraintProps( rgParamConsts[iConst],
NULL,
&tokConst ) );
switch (TypeFromToken(tokConst))
{
case mdtTypeRef:
{
Module_ID mid;
mdTypeDef tokClass;
IfFailGo( CDebugClassFieldType::GetClassToken(m_spSH, m_idModule, tokConst, &mid, &tokClass) );
IfFailGo( m_spSH->CreateClassType( mid, tokClass, ppConstraints + iConstOut ) );
iConstOut++;
break;
}
case mdtTypeDef:
{
IfFailGo( m_spSH->CreateClassType( m_idModule, tokConst, ppConstraints + iConstOut ) );
iConstOut++;
break;
}
case mdtTypeSpec:
{
PCCOR_SIGNATURE pvSig;
ULONG cbSig;
DWORD cb = 0;
DWORD dwElementType;
IfFailGo( pMetadata2->GetTypeSpecFromToken( tokConst, &pvSig, &cbSig) );
cb += CorSigUncompressData(&(pvSig[cb]), &dwElementType);
IfFailGo( m_spSH->CreateType( pvSig, cbSig, m_idModule, mdMethodDefNil, m_pGenScope, ppConstraints + iConstOut ) );
iConstOut++;
break;
}
default:
{
ASSERT(!"Bad constraint token");
}
}
}
*pcConstraints = iConstOut;
Error:
METHOD_EXIT( CDebugGenericParamFieldType::GetConstraints, hr );
DELETERG(rgParamConsts);
return hr;
}