[解決済み] C#でリフレクションを使用してデフォルトコンストラクタのない型のインスタンスを作成する
2022-11-18 09:42:13
質問
次のような授業を例にとります。
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
次に、リフレクションを使ってこの型のインスタンスを作りたいと思います。
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
通常、これはうまくいきますが
SomeType
にはパラメータなしのコンストラクタが定義されていないため、この呼び出しは
Activator.CreateInstance
を呼び出すと
MissingMethodException
というメッセージとともに
このオブジェクトにはパラメータレスコンストラクタが定義されていません。
この型のインスタンスを作成する別の方法はありますか?私のすべてのクラスにパラメータレスコンストラクタを追加するのはちょっと嫌です。
どのように解決するのですか?
私はもともとこの答えを投稿しました ここで に投稿したものですが、全く同じ質問ではありませんが、同じ回答がありましたので転載します。
FormatterServices.GetUninitializedObject()
はコンストラクタを呼び出すことなくインスタンスを作成します。 このクラスを見つけるには
リフレクタ
を使い、.Net のコアなシリアライズクラスをいくつか調べていくうちに、このクラスを見つけました。
以下のサンプルコードを使ってテストしてみましたが、とてもうまくいったようです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Runtime.Serialization;
namespace NoConstructorThingy
{
class Program
{
static void Main(string[] args)
{
MyClass myClass = (MyClass)FormatterServices.GetUninitializedObject(typeof(MyClass)); //does not call ctor
myClass.One = 1;
Console.WriteLine(myClass.One); //write "1"
Console.ReadKey();
}
}
public class MyClass
{
public MyClass()
{
Console.WriteLine("MyClass ctor called.");
}
public int One
{
get;
set;
}
}
}
関連
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】パディングが無効で、削除できない?
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。
-
[解決済み] リフレクションを使用して文字列からプロパティ値を取得する
-
[解決済み] Typeから新しいオブジェクトのインスタンスを作成する方法
-
[解決済み] C#のリフレクションで型がインターフェースを実装しているかどうかを判断する方法
-
[解決済み] プログラム上のデフォルトに相当するもの(Type)
-
[解決済み】デフォルトのコンストラクタとデストラクタの「=default」は「{}」とどう違うのですか?
-
[解決済み】クラス名でインスタンスを作成し、コンストラクタを呼び出す場合
-
[解決済み] XMLシリアライズ可能なクラスがパラメータなしのコンストラクタを必要とする理由
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] エンティティタイプ ApplicationUser は、現在のコンテキストのモデルの一部ではありません。
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み] メンバー '<メンバー名>' にインスタンス参照でアクセスできない
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み】なぜこのコードはInvalidOperationExceptionを投げるのですか?
-
[解決済み】ファイルへの読み書きの際に共有違反のIOExceptionが発生する C#
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】Linq 構文 - 複数列の選択
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない