本文整理汇总了C#中CodeWriter.GetVariableExpression方法的典型用法代码示例。如果您正苦于以下问题:C# CodeWriter.GetVariableExpression方法的具体用法?C# CodeWriter.GetVariableExpression怎么用?C# CodeWriter.GetVariableExpression使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CodeWriter
的用法示例。
在下文中一共展示了CodeWriter.GetVariableExpression方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: WriteClassPropertyAccessorSet
/// <summary>
/// Writes property setter, for FK properties
/// </summary>
/// <param name="writer"></param>
/// <param name="property"></param>
/// <param name="relatedAssociations"></param>
/// <param name="context"></param>
private void WriteClassPropertyAccessorSet(CodeWriter writer, Column property, IEnumerable<Association> relatedAssociations, GenerationContext context)
{
// if new value if different from old one
using (writer.WriteIf(writer.GetDifferentExpression(writer.GetPropertySetValueExpression(),
writer.GetVariableExpression(property.Storage))))
{
// if the property is used as a FK, we ensure that it hasn't been already loaded or assigned
foreach (var relatedAssociation in relatedAssociations)
{
// first thing to check: ensure the association backend isn't already affected.
// if it is the case, then the property must not be manually set
// R# considers the following as an error, but the csc doesn't
//var memberName = ReflectionUtility.GetMemberInfo<DbLinq.Data.Linq.EntityRef<object>>(e => e.HasLoadedOrAssignedValue).Name;
var memberName = "HasLoadedOrAssignedValue";
using (writer.WriteIf(writer.GetMemberExpression(relatedAssociation.Storage, memberName)))
{
writer.WriteLine(writer.GetThrowStatement(writer.GetNewExpression(
writer.GetMethodCallExpression(
writer.GetLiteralFullType(
typeof(
System.Data.Linq.
ForeignKeyReferenceAlreadyHasValueException
)))
)));
}
}
// the before and after are used by extensions related to interfaces
// for example INotifyPropertyChanged
// here the code before the change
foreach (IImplementation implementation in context.Implementations())
implementation.WritePropertyBeforeSet(writer, property, context);
// property assignment
writer.WriteLine(
writer.GetStatement(
writer.GetAssignmentExpression(writer.GetVariableExpression(property.Storage),
writer.GetPropertySetValueExpression())));
// here the code after change
foreach (IImplementation implementation in context.Implementations())
implementation.WritePropertyAfterSet(writer, property, context);
}
}
示例2: WriteClassEqualsAndHash
protected virtual void WriteClassEqualsAndHash(CodeWriter writer, Table table, GenerationContext context)
{
List<DbLinq.Schema.Dbml.Column> primaryKeys = table.Type.Columns.Where(c => c.IsPrimaryKey).ToList();
if (primaryKeys.Count == 0)
{
writer.WriteLine("#warning L189 table {0} has no primary key. Multiple C# objects will refer to the same row.",
table.Name);
return;
}
using (writer.WriteRegion(string.Format("GetHashCode(), Equals() - uses column {0} to look up objects in liveObjectMap",
string.Join(", ", primaryKeys.Select(pk => pk.Member).ToList().ToArray()))))
{
// GetHashCode
using (writer.WriteMethod(SpecificationDefinition.Public | SpecificationDefinition.Override,
"GetHashCode", typeof(int)))
{
string hashCode = null;
foreach (var primaryKey in primaryKeys)
{
var member = writer.GetVariableExpression(primaryKey.Storage);
string primaryKeyHashCode = writer.GetMethodCallExpression(writer.GetMemberExpression(member, "GetHashCode"));
if (primaryKey.CanBeNull
|| GetType(primaryKey.Type, false).IsClass) // this patch to ensure that even if DB does not allow nulls,
// our in-memory object won't generate a fault
{
var isNullExpression = writer.GetEqualExpression(member, writer.GetNullExpression());
var nullExpression = writer.GetLiteralValue(0);
primaryKeyHashCode = "(" + writer.GetTernaryExpression(isNullExpression, nullExpression, primaryKeyHashCode) + ")";
}
if (string.IsNullOrEmpty(hashCode))
hashCode = primaryKeyHashCode;
else
hashCode = writer.GetXOrExpression(hashCode, primaryKeyHashCode);
}
writer.WriteLine(writer.GetReturnStatement(hashCode));
}
writer.WriteLine();
// Equals
string otherAsObject = "o";
using (writer.WriteMethod(SpecificationDefinition.Public | SpecificationDefinition.Override,
"Equals", typeof(bool), new ParameterDefinition { Type = typeof(object), Name = otherAsObject }))
{
string other = "other";
writer.WriteLine(writer.GetStatement(writer.GetAssignmentExpression(
writer.GetDeclarationExpression(other, table.Type.Name),
writer.GetCastExpression(otherAsObject, table.Type.Name,
false))));
using (writer.WriteIf(writer.GetEqualExpression(other, writer.GetNullExpression())))
{
writer.WriteLine(writer.GetReturnStatement(writer.GetLiteralValue(false)));
}
string andExpression = null;
foreach (var primaryKey in primaryKeys)
{
var member = writer.GetVariableExpression(primaryKey.Storage);
string primaryKeyTest = writer.GetMethodCallExpression(
writer.GetMemberExpression(
writer.GetMemberExpression(
writer.GetGenericName("System.Collections.Generic.EqualityComparer", primaryKey.Type),
"Default"),
"Equals"),
member,
writer.GetMemberExpression(other, member));
if (string.IsNullOrEmpty(andExpression))
andExpression = primaryKeyTest;
else
andExpression = writer.GetAndExpression(andExpression, primaryKeyTest);
}
writer.WriteLine(writer.GetReturnStatement(andExpression));
}
}
}
示例3: WriteClassPropertyAccessors
/// <summary>
/// Writes property accessor
/// </summary>
/// <param name="writer"></param>
/// <param name="property"></param>
/// <param name="relatedAssociations"></param>
/// <param name="context"></param>
protected virtual void WriteClassPropertyAccessors(CodeWriter writer, Column property, IEnumerable<Association> relatedAssociations, GenerationContext context)
{
//generate [Column(...)] attribute
var column = NewAttributeDefinition<ColumnAttribute>();
column["Storage"] = property.Storage;
column["Name"] = property.Name;
column["DbType"] = property.DbType;
// be smart: we only write attributes when they differ from the default values
var columnAttribute = new ColumnAttribute();
if (property.IsPrimaryKey != columnAttribute.IsPrimaryKey)
column["IsPrimaryKey"] = property.IsPrimaryKey;
if (property.IsDbGenerated != columnAttribute.IsDbGenerated)
column["IsDbGenerated"] = property.IsDbGenerated;
if (property.AutoSync != DbLinq.Schema.Dbml.AutoSync.Default)
column["AutoSync"] = new EnumFullname("AutoSync", property.AutoSync);
if (property.CanBeNull != columnAttribute.CanBeNull)
column["CanBeNull"] = property.CanBeNull;
if (property.Expression != null)
column["Expression"] = property.Expression;
var specifications = property.AccessModifierSpecified
? GetSpecificationDefinition(property.AccessModifier)
: SpecificationDefinition.Public;
if (property.ModifierSpecified)
specifications |= GetSpecificationDefinition(property.Modifier);
//using (WriteAttributes(writer, context.Parameters.MemberExposedAttributes))
using (WriteAttributes(writer, GetAttributeNames(context, context.Parameters.MemberAttributes)))
using (writer.WriteAttribute(NewAttributeDefinition<DebuggerNonUserCodeAttribute>()))
using (writer.WriteAttribute(column))
using (writer.WriteProperty(specifications, property.Member, GetTypeOrExtendedType(writer, property)))
{
// on auto storage, we're just lazy
if (property.Storage == null)
writer.WriteAutomaticPropertyGetSet();
else
{
using (writer.WritePropertyGet())
{
writer.WriteLine(writer.GetReturnStatement(writer.GetVariableExpression(property.Storage)));
}
using (writer.WritePropertySet())
{
WriteClassPropertyAccessorSet(writer, property, relatedAssociations, context);
}
}
}
}