文字列型のフィールド値を置換する
この例はすべての文字列フィールドの特定文字を強制的に置換するサンプルです。プロジェクトのすべてのモデルを取得し、フィールドの型が文字列型の場合に、文字列を置き返しています。
public void ReplaceStrings(ICommandContext c, ICommandParams p)
{
// すべてのモデルを取得します
var models = c.App.Workspace.CurrentProject.GetAllChildren();
// モデル毎に処理します
foreach(var model in models)
{
// メタクラスのフィールド情報を取得します
var fields = model.Metaclass.GetFields();
// 文字列型の場合のみ処理します
var strFields = fields.Where(f => f.Type == "String");
foreach(var field in strFields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;
// 文字列を取得します
var currentString = model.GetFieldString(field.Name);
// 文字列を置き換えます
var replacedString = currentString.Replace("\v", "\r\n");
if(currentString != replacedString)
{
model.SetField(field.Name, replacedString);
}
}
}
}
次の例はすべての文字列フィールドを***
でマスクする例です。
public void MaskStrings(ICommandContext c, ICommandParams p)
{
var models = c.App.Workspace.CurrentProject.GetAllChildren();
// すべてのモデルに対して処理をします
foreach ( var model in models)
{
// メタクラスのフィールド情報を取得します
var fields = model.Metaclass.GetFields();
if ( fields == null ) continue;
foreach(var field in fields)
{
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;
// 文字列型以外は無視します
if ( field.Type != "String" ) continue;
// 文字列をマスクします
model.SetField(field,"***");
}
}
}
ヒント
フィールドがシステムのフィールドかどうかは次の条件で判断できます。
- フィールド名が
___
または$
で始まる場合。 - フィールドのタグに
System
やSystem.Core
が設定されている場合
下記のコードを参考にしてください。
IField field;
//...
// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;