メインコンテンツまでスキップ

文字列型のフィールド値を置換する

この例はすべての文字列フィールドの特定文字を強制的に置換するサンプルです。プロジェクトのすべてのモデルを取得し、フィールドの型が文字列型の場合に、文字列を置き返しています。

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,"***");
}
}
}
ヒント

フィールドがシステムのフィールドかどうかは次の条件で判断できます。

  • フィールド名が___または$で始まる場合。
  • フィールドのタグにSystemSystem.Coreが設定されている場合

下記のコードを参考にしてください。

IField field;

//...

// システムフィールドは除外します
if (field.Name.StartsWith("___") || field.Name.StartsWith("$") || field.HasTags("System,System.Core")) continue;