そのため、C# はオプションのパラメーターをサポートしています。
void MethodName(string param = "optional!") { }
そして動的メソッドのパラメータ:
void MethodName(dynamic param) { }
残念ながら、これらを一緒に使用することはできません (オプションの param 値は定数でなければなりません):
void MethodName(dynamic param = new { p1 = "", p2 = 0M }) { }
私は過去に次のようなものを使用しました:
void GenericAnonHandler<T>(IEnumerable<T> param)
{
foreach(T item in param)
{
var typedItem = Cast(item, new { p1 = "", p2 = 0M });
var p2 = typedItem.p2; // Hark, IntelliSense!
}
}
static T Cast<T>(object obj, T type)
{
return (T)obj;
}
void CallingMethod()
{
var list1 = new List<ThisType>() { ... };
var list2 = new List<ThatType>() { ... };
var anon1 = list1
.Select(x =>
new { p1 = x.sPropName, p2 = x.dPropName });
var anon2 = list2
.Select(x =>
new { p1 = x.sPropName2, p2 = x.dPropName2 });
var both = anon1.Concat(anon2);
GenericAnonHandler(both);
}
しかし、それは多くの余分な作業と型固有のコーディングであり、動的型がどうあるべきかを知っている限り、新しいクラスまたは単に動的を使用する方が簡単になります..しかし、動的はIntelliSenseを提供しません(そして合理的にそれで)。
インターフェイスを使用したいのですが、ソースの種類 (この例では ThisType、ThatType) のプロパティ名が異なり、それら (サードパーティのアセンブリ) を制御できないため、使用できません。
ただし、それらは部分クラスであるため、統一されたプロパティ名と異なるプロパティ名を持つ匿名型のシグネチャを使用してインターフェイスを作成し、部分的にインターフェイスを実装し、「その他」から欠落している値のダミー プロパティを作成できます。タイプに応じて、それぞれのプロパティから値を取得します。
..しかし、それも大変な作業です..特に、3 つの新しいアイテム (インターフェイス、2 つのパーシャル) を作成するためにあらゆる努力をしている場合はなおさらです。anon 型を実際のクラスとして作成し、前の 2 つの型から変換する方が簡単です。
私が望んでいることを達成するための巧妙な方法があるかどうかを尋ねるだけです。インテリセンスを機能させるオプションの動的パラメータ?
私はこれがばかげた質問であることを知っています..そして基本的には、実際にクラスを定義せずにクラスを定義するにはどうすればよいでしょうか.. Cast(T,Type) ルート以外のトリックを備えたウィザードがそこにあるかどうか疑問に思っています:)