public EXPRPropertyInfo CreatePropertyInfo(PropertySymbol prop, AggregateType propertyType) { Debug.Assert(prop != null); Debug.Assert(propertyType != null); EXPRPropertyInfo propInfo = new EXPRPropertyInfo(); propInfo.kind = ExpressionKind.EK_PROPERTYINFO; propInfo.type = GetTypes().GetOptPredefAgg(PredefinedType.PT_PROPERTYINFO).getThisType(); propInfo.flags = 0; propInfo.Property = new PropWithType(prop, propertyType); return(propInfo); }
///////////////////////////////////////////////////////////////////////////////// private PropertyInfo GetPropertyInfoFromExpr(EXPRPropertyInfo propinfo) { // To do this, we need to construct a type array of the parameter types, // get the parent constructed type, and get the property from it. AggregateType aggType = propinfo.Property.Ats; PropertySymbol propSym = propinfo.Property.Prop(); TypeArray genericInstanceParams = _typeManager.SubstTypeArray(propSym.Params, aggType, null); CType genericInstanceReturn = _typeManager.SubstType(propSym.RetType, aggType, null); Type type = aggType.AssociatedSystemType; PropertyInfo propertyInfo = propSym.AssociatedPropertyInfo; // This is to ensure that for embedded nopia types, we have the // appropriate local type from the member itself; this is possible // because nopia types are not generic or nested. if (!type.GetTypeInfo().IsGenericType && !type.IsNested) { type = propertyInfo.DeclaringType; } foreach (PropertyInfo p in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static)) { #if UNSUPPORTEDAPI if ((p.MetadataToken != propertyInfo.MetadataToken) || (p.Module != propertyInfo.Module)) #else if (!p.HasSameMetadataDefinitionAs(propertyInfo)) { #endif continue; } Debug.Assert((p.Name == propertyInfo.Name) && (p.GetIndexParameters() == null || p.GetIndexParameters().Length == genericInstanceParams.size)); bool bMatch = true; ParameterInfo[] parameters = p.GetSetMethod(true) != null ? p.GetSetMethod(true).GetParameters() : p.GetGetMethod(true).GetParameters(); for (int i = 0; i < genericInstanceParams.size; i++) { if (!TypesAreEqual(parameters[i].ParameterType, genericInstanceParams.Item(i).AssociatedSystemType)) { bMatch = false; break; } } if (bMatch) { return p; } } Debug.Assert(false, "Could not find matching property"); throw Error.InternalCompilerError(); }
public EXPRPropertyInfo CreatePropertyInfo(PropertySymbol prop, AggregateType propertyType) { Debug.Assert(prop != null); Debug.Assert(propertyType != null); EXPRPropertyInfo propInfo = new EXPRPropertyInfo(); propInfo.kind = ExpressionKind.EK_PROPERTYINFO; propInfo.type = GetTypes().GetOptPredefAgg(PredefinedType.PT_PROPERTYINFO).getThisType(); propInfo.flags = 0; propInfo.Property = new PropWithType(prop, propertyType); return propInfo; }