2010-12-01 6 views
1

タイトルにはすべてがあります: C#readonly自動実装されたプロペットをリフレクションで設定する方法はありますか?リフレクションによってC#readonly自動実装のプロペティを設定する方法はありますか?

typeof(Change) 
    .GetProperty("ChangeType", BindingFlags.Instance | BindingFlags.Public) 
    .SetValue(myChange, change.ChangeType.Transform(),null); 

この行は私にエラーを与える:System.ArgumentExceptionの - { "プロパティのsetメソッドが見つかりません。"}。物事はフィールドがないので、GetFieldを使用できません。

私はすでに完成したライブラリを「補完」する必要があり、そのコードにアクセスすることができないので、私はこれをやっています。

答えて

4

これはうまくいくはずなので、私たちに言っていないことがあります。あなたはそれが自動実装されたプロパティだと確信していますか?あなたが見ているものと一致する説明は、プロパティが自動実装されておらず、セッターを持っていないということです。

public class Foo { public int Bar { get; set; } } 

typeof(Foo).GetProperty("Bar").SetValue(foo, 42); 

が成功するさ

が、

public class Foo { public int Bar { get { return 42; } } } 

typeof(Foo).GetProperty("Bar").SetValue(foo, 42); 

は、それはあなたが見ているメッセージと例外が生成されますことはありません。

+0

ああ。ええ、これはそうだと思います。プロパティはセッターを持っていません...私はその「取得」が実際に得ていることを知らないので、多くの意味がありません。クラスにはフィールドはありませんが、セッターなしの3つのプロパティがあります(そのため、私はそれらが自動実装されていると仮定しています)。私はそれを変える唯一の方法は、ゲッターが何をするかを見つけ、必要なものを変えることだと思います。どのように私はそれを行うことができますか? –

+1

@Conrad getterの仕組みを調べるためにリフレクターを使用してください。 –

+0

@Jason - brainfart、実際にそれについて考える機会があった後にコメントが削除されました。 – tvanfosson

1

明らかな結論は、Change.ChangeTypeにはパブリックインスタンスセッターがないことです。

+0

あまりありません。プライベート・セッターを持つ自動実装のパブリック・プロパティーの場合は、パブリック・インスタンス・セッターを持つことはできず、依然として動作していることを示す上で、上記は成功します。 – jason

関連する問題