本文整理汇总了C#中Mono.Cecil.PropertyDefinition.GetBackingField方法的典型用法代码示例。如果您正苦于以下问题:C# PropertyDefinition.GetBackingField方法的具体用法?C# PropertyDefinition.GetBackingField怎么用?C# PropertyDefinition.GetBackingField使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Mono.Cecil.PropertyDefinition
的用法示例。
在下文中一共展示了PropertyDefinition.GetBackingField方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: WeaveProperty
private WeaveResult WeaveProperty(PropertyDefinition prop, TypeDefinition type, Dictionary<string, Tuple<MethodReference, MethodReference>> methodTable)
{
var columnName = prop.Name;
var mapToAttribute = prop.CustomAttributes.FirstOrDefault(a => a.AttributeType.Name == "MapToAttribute");
if (mapToAttribute != null)
{
columnName = (string)mapToAttribute.ConstructorArguments[0].Value;
}
var backingField = prop.GetBackingField();
var isIndexed = prop.CustomAttributes.Any(a => a.AttributeType.Name == "IndexedAttribute");
if (isIndexed && (!_indexableTypes.Contains(prop.PropertyType.FullName)))
{
return WeaveResult.Error($"{type.Name}.{prop.Name} is marked as [Indexed] which is only allowed on integral types as well as string, bool and DateTimeOffset, not on {prop.PropertyType.FullName}.");
}
var isPrimaryKey = prop.IsPrimaryKey();
if (isPrimaryKey && (!_primaryKeyTypes.Contains(prop.PropertyType.FullName)))
{
return WeaveResult.Error($"{type.Name}.{prop.Name} is marked as [PrimaryKey] which is only allowed on integral and string types, not on {prop.PropertyType.FullName}.");
}
var isRequired = prop.IsRequired();
if (isRequired &&
!prop.IsNullable() &&
prop.PropertyType.FullName != StringTypeName &&
prop.PropertyType.FullName != ByteArrayTypeName)
{
return WeaveResult.Error($"{type.Name}.{prop.Name} is marked as [Required] which is only allowed on strings or nullable scalar types, not on {prop.PropertyType.FullName}.");
}
if (!prop.IsAutomatic())
{
if (prop.PropertyType.Resolve().BaseType.IsSameAs(_references.RealmObject))
{
return WeaveResult.Warning($"{type.Name}.{columnName} is not an automatic property but its type is a RealmObject which normally indicates a relationship.");
}
return WeaveResult.Skipped();
}
if (_typeTable.ContainsKey(prop.PropertyType.FullName))
{
// If the property is automatic but doesn't have a setter, we should still ignore it.
if (prop.SetMethod == null)
{
return WeaveResult.Skipped();
}
var typeId = prop.PropertyType.FullName + (isPrimaryKey ? " unique" : string.Empty);
Tuple<MethodReference, MethodReference> realmAccessors;
if (!methodTable.TryGetValue(typeId, out realmAccessors))
{
var getter = new MethodReference("Get" + _typeTable[prop.PropertyType.FullName] + "Value", prop.PropertyType, _references.RealmObject)
{
HasThis = true,
Parameters = { new ParameterDefinition(ModuleDefinition.TypeSystem.String) }
};
var setter = new MethodReference("Set" + _typeTable[prop.PropertyType.FullName] + "Value" + (isPrimaryKey ? "Unique" : string.Empty), ModuleDefinition.TypeSystem.Void, _references.RealmObject)
{
HasThis = true,
Parameters =
{
new ParameterDefinition(ModuleDefinition.TypeSystem.String),
new ParameterDefinition(prop.PropertyType)
}
};
methodTable[typeId] = realmAccessors = Tuple.Create(getter, setter);
}
ReplaceGetter(prop, columnName, realmAccessors.Item1);
ReplaceSetter(prop, backingField, columnName, realmAccessors.Item2);
}
else if (prop.IsIList())
{
var elementType = ((GenericInstanceType)prop.PropertyType).GenericArguments.Single();
if (!elementType.Resolve().BaseType.IsSameAs(_references.RealmObject))
{
return WeaveResult.Warning($"SKIPPING {type.Name}.{columnName} because it is an IList but its generic type is not a RealmObject subclass, so will not persist.");
}
if (prop.SetMethod != null)
{
return WeaveResult.Error($"{type.Name}.{columnName} has a setter but its type is a IList which only supports getters.");
}
var concreteListConstructor = _references.System_Collections_Generic_ListOfT_Constructor.MakeHostInstanceGeneric(elementType);
// weaves list getter which also sets backing to List<T>, forcing it to accept us setting it post-init
var backingDef = backingField as FieldDefinition;
if (backingDef != null)
{
backingDef.Attributes &= ~FieldAttributes.InitOnly; // without a set; auto property has this flag we must clear
}
ReplaceListGetter(prop, backingField, columnName,
new GenericInstanceMethod(_references.RealmObject_GetListValue) { GenericArguments = { elementType } },
concreteListConstructor);
}
//.........这里部分代码省略.........