クラスのコンストラクタの前にフィールドまたはプロパティに値を代入できますか?コンストラクタの前にフィールドまたはプロパティの値を設定する
あなたは非静的であるフィールドまたはプロパティを参照している場合、答えはノーであるあなたに
クラスのコンストラクタの前にフィールドまたはプロパティに値を代入できますか?コンストラクタの前にフィールドまたはプロパティの値を設定する
あなたは非静的であるフィールドまたはプロパティを参照している場合、答えはノーであるあなたに
はい、これを行うには卑劣な方法があります。秘密のソースはFormatterServices.GetUninitializedObjectです。これはインスタンスを割り当てますが、コンストラクタは実行しません。リフレクションでフィールドとプロパティを設定し、コンストラクタを実行することができます。
簡単な例:
class Program
{
static void Main(string[] args)
{
object obj = FormatterServices.GetUninitializedObject(typeof(A));
obj.GetType().GetProperty("I").SetValue(obj, 1);
obj.GetType().GetConstructor(Type.EmptyTypes).Invoke(obj, null);
Console.WriteLine("Done");
}
}
class A
{
public A()
{
if (I != 0)
{
Console.WriteLine("Who set me? I = {0}", I);
}
}
public int I { get; set; }
}
あなたは私の質問を理解した唯一の人でした。 多くのおかげで、まさに私が欲しかったことです。 – Junior
ありがとうございます。
コンストラクタが呼び出される前に実際にクラスのインスタンスが存在しないため、フィールドまたはプロパティを設定するインスタンスはありません。
ただし、クラスのデフォルト値を指定するだけの場合は、フィールドまたはプロパティの宣言の後にデフォルトの代入を追加するだけで、これを行うことができます。
ように;
public class MyClass
{
public string MyString { get; set; } = "Default Value";
public MyClass()
{
}
}
ここで、MyClassのすべてのインスタンスは、再割り当てされるまで、値が「デフォルト値」のMyStringプロパティを持ちます。
ありがとうございますが、あなたは私の質問を理解できませんでした。マイクの反応を見て、彼は理解した。 – Junior
そう尋ねるまたはnoの質問は、一般的に答え、誰が将来的に読み込む尋ねる人のための非生産的です。おそらくあなたの質問を編集しますか? –
なぜあなたはそれをしますか? –