4

我想编写一个方法来获取 T4 模板文件中属性的 Nullable 状态。

我已经将它写在我的 TT 文件中,但在 T4 文件中它是不同的

bool IsRequired(object property) {
    bool result=false;

    ? ? ? ? ? ? ? ? ? ? ? ?

    return result;
}

List<ModelProperty> GetEligibleProperties(EnvDTE.CodeType typeInfo, bool includeUnbindableProperties) {
    List<ModelProperty> results = new List<ModelProperty>();
    if (typeInfo != null) {
        foreach (var prop in typeInfo.VisibleMembers().OfType<EnvDTE.CodeProperty>()) {
            if (prop.IsReadable() && !prop.HasIndexParameters() && (includeUnbindableProperties || IsBindableType(prop.Type))) {
                results.Add(new ModelProperty {
                    Name = prop.Name,
                    ValueExpression = "Model." + prop.Name,
                    Type = prop.Type,
                    IsPrimaryKey = Model.PrimaryKeyName == prop.Name,
                    IsForeignKey = ParentRelations.Any(x => x.RelationProperty == prop),
                    IsReadOnly = !prop.IsWriteable(),

                    // I Added this >>
                    IsRequired = IsRequired(prop)
                });
            }
        }
    }

怎么做???

4

2 回答 2

3

一年后在同一个问题上苦苦挣扎,我发现了你的问题。我认为这不可能以简单的方式进行,因为您必须将 CodeTypeRef 传输到 Systemtype。这是一个不错的 hack,适用于模型和 mvcscaffolding:

bool IsNullable(EnvDTE.CodeTypeRef propType) {
  return propType.AsFullName.Contains(".Nullable<");
}

您应该以这种方式调用此函数:

               // I Added this >>
               // IsRequired = IsRequired(prop)
                IsRequired = !IsNullable(prop.Type);
            });
于 2013-04-27T08:55:59.213 回答
0

从 T4 模板调用它并没有什么特别之处,是吗?看到这个问题

我个人喜欢 Mike Jones 的回答,为方便起见,在此转载。

public static bool IsObjectNullable<T>(T obj)
{
  // If the parameter-Type is a reference type, or if the parameter is null, then the object is     always nullable
  if (!typeof(T).IsValueType || obj == null)
    return true;

  // Since the object passed is a ValueType, and it is not null, it cannot be a nullable object
  return false; 
}

public static bool IsObjectNullable<T>(T? obj) where T : struct
{
  // Always return true, since the object-type passed is guaranteed by the compiler to always be nullable
  return true;
}
于 2013-03-24T18:17:35.527 回答