私はクラスタイプがDictionary<object, Func<object, TreeNode>>
です。このプロパティをコンストラクタから(または式の本体を使って)幸いに設定することはできますが、プロパティのデフォルト値としては使用できません(プロパティが読み取り専用の場合やpublic get/setの場合は変更されません)。この問題は、代わりに辞書がフィールドに格納されている場合にも発生します。ディクショナリタイプのプロパティを設定するのはコンストラクタで機能しますが、デフォルトのプロパティを使用する場合は無効です
それは静的文脈に「メソッド名」は非静的メソッドにアクセスすることはできませんというエラーを思い付きます。
これが失敗したコードです:
public class TreeViewBuilder
{
public Dictionary<Type, Func<object, TreeNode>> ObjectTreeNodeBuilder { get; set; }
= new Dictionary<Type, Func<object, TreeNode>>
{
{typeof(Type1), t => BuildType1TreeNode((Type1) t)},
{typeof(Type2), t => BuildType2TreeNode((Type2) t)},
};
public TreeNode BuildType1TreeNode(Type1 type1)
{
return new TreeNode { Tag = type1 };
}
public TreeNode BuildType2TreeNode(Type2 type2)
{
return new TreeNode { Tag = type2 };
}
}
しかし、このコードは大丈夫です:
public class TreeViewBuilder
{
public Dictionary<Type, Func<object, TreeNode>> ObjectTreeNodeBuilder { get; set; }
public TreeViewBuilder()
{
ObjectTreeNodeBuilder = new Dictionary<Type, Func<object, TreeNode>>
{
{typeof(Type1), t => BuildType1TreeNode((Type1) t)},
{typeof(Type2), t => BuildType2TreeNode((Type2) t)},
};
}
public TreeNode BuildType1TreeNode(Type1 type1)
{
return new TreeNode { Tag = type1 };
}
public TreeNode BuildType2TreeNode(Type2 type2)
{
return new TreeNode { Tag = type2 };
}
}
私はTreeViewBuilder
オブジェクトが完全に/インスタンス化される前にObjectTreeNodeBuilder
プロパティが初期化されていることを推測していますしたがって、その方法はまだ知られていない。これは、メソッドが静的でなければならないと不平を言う理由です。これは正しいのですか、それともフードの下で何かが起こっていますか?
_ "TreeViewBuilderオブジェクトが完全にインスタンス化され/構築される前にObjectTreeNodeBuilderプロパティが初期化されていると推測しています" _ - はい。より一般的には、コンストラクタが実行される前に 'this'を含むものにアクセスすることはできません。詳細については、重複したマークを参照してください。 –
@PeterDunihoマークされた重複はどこで確認できますか? – Ayb4btu
テキストの読み取りのすぐ下に表示されるリンクをクリックしてください。_ "この質問にはすでに回答があります:" _、あなたの質問の上部に表示されるバナーに見つかりました。 –