は、以下のクラスに与えられた値:私は与えられた値と各フィールドのList<UiGridColumn>
を作成したいシリアル化カスタム属性は
public class PayrollReport
{
[UiGridColumn(Name = "fullName",Visible = false,Width = "90")]
public string FullName { get; set; }
[UiGridColumn(Name = "weekStart", CellFilter = "date")]
public DateTime WeekStart { get; set; }
}
そして、このカスタム属性
[AttributeUsage(AttributeTargets.All)]
public class UiGridColumn : Attribute
{
public string CellFilter { get; set; }
public string DisplayName { get; set; }
public string Name { get; set; }
public bool Visible { get; set; }
public string Width { get; set; }
}
を(私はしたくありませんスキップされたプロパティの場合はnull)。
List
の項目には指定された値のみが含まれていますが、List<UiGridColumn>
を作成することはできますか? (私はこれが可能ではないことを恐れているが、私は尋ねると思った)もしそうなら、どのように?
ない場合は、私の第二の好みはこのような文字列の配列になります:私は手動で希望JSON
文字列を構築するために、各property
とattribute
とargument
ていないループを好むだろう
[{"name":"fullName","visible":false,"width":"90"},{"name":"weekStart","cellFilter":"date"}]
が、私は避難所」そうでなければ簡単に行う方法を見つけることができました。
public List<Object> GetUiGridColumnDef(string className)
{
Assembly assembly = typeof(DynamicReportService).Assembly;
var type = assembly.GetType(className);
var properties = type.GetProperties();
var columnDefs = new List<object>();
foreach (var property in properties)
{
var column = new Dictionary<string, Object>();
var attributes = property.CustomAttributes;
foreach (var attribute in attributes)
{
if (attribute.AttributeType.Name != typeof(UiGridColumn).Name || attribute.NamedArguments == null)
continue;
foreach (var argument in attribute.NamedArguments)
{
column.Add(argument.MemberName, argument.TypedValue.Value);
}
}
columnDefs.Add(column);
}
return columnDefs;
}
これを行うより良い方法はありますか?
これはほぼ完璧です。 'Visible'は1つのプロパティに対してのみ定義されていましたが、' bool'であるため両方に表示されます。それを 'nullable'にしようとすると' Visible 'は有効な属性パラメータ型ではないため、有効な名前付き属性引数ではありません。提案? – davids
'DefaultValueHandling = DefaultValueHandling.Ignore'を設定で使用して、' false'のデフォルト値に設定されているときに 'Visible'を抑制することができます。しかし、それは明示的にfalseに設定した最初のオブジェクトに対してもこれを抑止します。残念なことに、このソリューションでは、両方の方法を使用することはできません。常に値を含めるか、デフォルトと異なる場合にのみ値を含めるかのどちらかです。 –
お役立ち情報私はデフォルト値をスキップして大丈夫です。しかし、デフォルトでは 'Visible'を' true'にしたいので、デフォルト値を変更して 'DefaultValueHandling'コードを追加しました。期待どおりに動作します。ありがとう! – davids