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

1年後、同じ質問に苦労していて、あなたの質問を見つけました。CodeTypeRef を Systemtype に転送する必要があるため、単純な方法では可能ではないと思います。これは、モデルと 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 テンプレートから呼び出されるのは特別なことではありませんね。この質問を参照してください

私は個人的にマイク・ジョーンズの答えが好きで、便宜上ここに再現しました。

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 に答える