私は、実行時に知られている型がパラメータのないコンストラクタを提供しているかどうかチェックしたいと思います。 Type
クラスは有望なものを得られなかったので、私はリフレクションを使用しなければならないと仮定していますか?型がパラメータのないコンストラクタを提供するかどうかを確認するにはどうすればよいですか?
答えて
Type
クラスが反映したものです。次のようにすることができます。
Type theType = myobject.GetType(); // if you have an instance
// or
Type theType = typeof(MyObject); // if you know the type
var constructor = theType.GetConstructor(Type.EmptyTypes);
パラメータのないコンストラクタが存在しない場合はnullを返します。
あなたも少し長いを使用し、プライベートコンストラクタを検索する場合:
var constructor = theType.GetConstructor(
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
null, Type.EmptyTypes, null);
aren't allowed to have a default constructor値型、のための注意点はあります。 Type.IsValueType
プロパティを使用して値の型があるかどうかを確認し、Activator.CreateInstance(Type)
を使用してインスタンスを作成します。
はい、Reflectionを使用する必要があります。
var t = x.GetType();
var c = t.GetConstructor(new Type[0]);
if (c != null) ...
これは動作するはずです::しかし、あなたはすでにあなたのようなGetType()
何かを使用する場合があることを行う
myClass.GetType().GetConstructors()
.All(c=>c.GetParameters().Length == 0)
私が言ったことではありませんが、削除しないでください - それは関連する問題と素晴らしい情報です。 – mafu
はい、反射を使用する必要があります。
object myObject = new MyType();
Type type = myObject.GetType();
ConstructorInfo conInfo = type.GetConstructor(new Type[0]);
あなたの状況に応じて、あなたはまた、ジェネリック型の制約を使用することができます。
public void DoSomethingWith<T>(T myObject) where T:new() {...}
上記のメソッドの宣言は、パラメータなしのコンストラクタでインスタンス化することができる任意のオブジェクトにパラメータタイプを制限します。ここでの利点は、コンパイラがパラメータのないコンストラクタを持たないクラスでメソッドを使用しようとする試みをキャッチすることです。コンパイル時にタイプが分かっている限り、これはうまく動作します。問題は早い。
タイプが実際には実行時にしかわからない場合(つまり、Activator.CreateInstance()を使用して文字列や構造化タイプに基づいてオブジェクトをインスタンス化する場合)、これは役に立ちません。私は一般にリフレクションを絶対最後のオプションとして使用します。なぜなら、一度あなたがダイナミックな土地に行くと、あなたはダイナミックな土地に留まる必要があるからです。動的にインスタンス化してから静的に処理するのは、通常は難しく、あるいは面倒です。
実際には、静的および動的呼び出しの土地を結ぶのに非常に有用なパターンがあります。 'EqualityComparer.Default
type.GetConstructor(Type.EmptyTypes) != null
は、struct
で失敗します。より良いそれを拡張します
public static bool HasDefaultConstructor(this Type t)
{
return t.IsValueType || t.GetConstructor(Type.EmptyTypes) != null;
}
は成功してもenum
sがデフォルトパラメータなしのコンストラクタを持っているので。また、リフレクションコールが行われていないため、値型の速度が若干上がります。
のみのコンストラクタを計算する必要がありましたオプションパラメータは、実際のパラメータなしコンストラクタと同じです。これを行うには:
myClass.GetType().GetConstructors()
.All(c => c.GetParameters().Length == 0 || c.GetParameters().All(p => p.IsOptional))
- 1. 提供されたパラメータがJavascriptのバイト配列の型かどうかを確認するにはどうすればよいですか?
- 2. ジェネリックメソッドパラメータが値型であるかどうかを確認するにはどうすればよいですか?
- 3. AWS SDKに資格情報が提供されているかどうかを確認するにはどうすればよいですか?
- 4. jquery:ページにフォーカスがないかどうかを確認するにはどうすればよいですか?
- 5. pandasデータフレームの列がdatetime型であるかどうかを確認するにはどうすればよいですか?列が数値かどうかを確認するにはどうすればよいですか?
- 6. ポップアップページが開いているかどうかを確認するにはどうすればよいですか?
- 7. カスタムデータ型をパラメータとしてNpgsqlに提供するにはどうすればいいですか?
- 8. ユーザーがindex.htmlにいるかどうかを確認するにはどうすればよいですか?
- 9. Android搭載端末が場所を提供できるかどうかを確認するにはどうすればよいですか?
- 10. ネットパイプサービスがリッスンしているかどうかを確認するにはどうすればよいですか
- 11. エクスプレスサブドメインでリアクションアプリを提供するにはどうすればよいですか?
- 12. koaでフロントエンドを提供するにはどうすればよいですか?
- 13. イメージピラミッドをフロントエンドに提供するにはどうすればよいですか?
- 14. ファイルが有効なExcelスプレッドシートかどうかを確認するにはどうすればよいですか?
- 15. RESTful APIのパラメータに有効な値のリストを提供するにはどうすればよいですか?
- 16. データが新しいかどうかを確認するにはどうすればよいですか?
- 17. Facebookのタイムラインがあるかどうかを確認するにはどうすればよいですか?
- 18. Scala - オブジェクトがスレッドセーフであるかどうかを確認するにはどうすればよいですか?
- 19. フォームがヘルプモードであるかどうかを確認するにはどうすればよいですか?
- 20. アンドロイドアプリがハイブリッドアプリであるかどうかを確認するにはどうすればよいですか?
- 21. Java - シーンがフルスクリーンモードであるかどうかを確認するにはどうすればよいですか?
- 22. オブジェクトがコレクションであるかどうかを確認するにはどうすればよいですか? (スウィフト)
- 23. ウィンドウがオフスクリーンであるかどうかを確認するにはどうすればよいですか?
- 24. ファイルが空であるかどうかを確認するにはどうすればよいですか?
- 25. URLが画像であるかどうかを確認するにはどうすればよいですか?
- 26. TextFieldが整数であるかどうかを確認するにはどうすればよいですか?
- 27. オブジェクトが「空」であるかどうかを確認するにはどうすればよいですか?
- 28. テキストエリアが空であるかどうかを確認するにはどうすればよいですか?
- 29. ファイルが存在するかどうかを確認するにはどうすればよいですか?
- 30. レポが存在するかどうかを確認するにはどうすればよいですか?
私はそうだと思います – kenny
サイドローズ:パラメータのないコンストラクタには一般的な制約があります。 – CodesInChaos
は、タイプ**のみ**がパラメータのないコンストラクタを提供するか、それとも全く提供しないかという疑問です。 – BrokenGlass