質問
私は現在、このタイプのコード:
private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
if (MainObject is SomeClassType1)
{
SomeClassType1 HelpObject = (SomeClassType1)MainObject;
HelpObject.Property1 = Arg1;
HelpObject.Property2 = Arg2;
}
else if (MainObject is SomeClassType2)
{
SomeClassType2 HelpObject = (SomeClassType2)MainObject;
HelpObject.Property1 = Arg1;
HelpObject.Property2 = Arg2;
}
}
こSomeClassType1とSomeClassType2同じプロパティセットしたい割り当て(は異なりますがされているのではないだろうか)では、動的にキャストMainObjectの適切な型として割り当てる値がなく、複製のコードについて教えてください。このように末
private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
Type DynamicType = null;
if (MainObject is SomeClassType1)
{
DynamicType = typeof(SomeClassType1);
}
else if (MainObject is SomeClassType2)
{
DynamicType = typeof(SomeClassType2);
}
DynamicType HelpObject = (DynamicType)MainObject;
HelpObject.Property1 = Arg1;
HelpObject.Property2 = Arg2;
}
あり、C#と文句をつないでDynamicType:
の種類又は名前空間の名前"DynamicTypeみようと考えています(ま欠で利用するディレクティブまたは組立。)
というようにこのクライアントまで、フルのC#2.0?なりの乱れによって現在のコードは、見えなそうすることによって、私は非常に興味を持たれます。よろしく!
編集:で明らかに、完璧に理解する実装のインタフェースが最適なのは、間違いないものと考えられます。とはいえ、希望を見てどう思いを実施せずにインターフェース.詳細の回答!
解決
それはあなたがほぼ同じ2つのプロパティを実装する気なタイプの両方のように見えます。その場合には、何がやりたいことは、これらの特性のためのインタフェースを定義します。
public interface IMyInterface
{
public Foo Property1 {get; set;}
public Bar Property2 {get;set;}
}
次に、あなたのクラスのそれぞれが、彼らはその新しいインターフェイスを実装するコンパイラに指示してください。最後に、そのinteraceに拘束された型引数をジェネリックメソッドを使用します:
private void FillObject<T>(T MainObject, Foo Arg1, Bar Arg2)
where T : IMyInterface
{
MainObject.Property1 = Arg1;
MainObject.Property2 = Arg2;
}
の種類の数はあなたが上昇する心配している場合でも、インターフェイスを宣言するために余分なコードで、これらのスニペットはまだあなたが質問に投稿されたスニペットのいずれかより短くしてしまうと、このコードは、拡張することがはるかに簡単であることに注意してくださいます。
他のヒント
あなたはここでやっている基本的にはどのようなオブジェクトFOタイプに基づいてswitch文を書いています。 (せいぜい退屈である)あなたの最初の例よりも、この他を行うには、本質的には良い方法はありません。
私は、もう少し簡潔な構文を作るタイプに切り換えるための小さなフレームワークを書きました。それはあなたが次のようなコードを記述することができます。
TypeSwitch.Do(
sender,
TypeSwitch.Case<Button>(
() => textBox1.Text = "Hit a Button"),
TypeSwitch.Case<CheckBox>(
x => textBox1.Text = "Checkbox is " + x.Checked),
TypeSwitch.Default(
() => textBox1.Text = "Not sure what is hovered over"));
ブログポスト:ます。http://ブログ.msdn.com / jaredpar /アーカイブ/ 2008/05/16 /スイッチングオンtypes.aspxする
あなたはSomeClassType1、SomeClassType2などに変更を加えることができるだろうか?そうなら、私はあなたがプロパティを設定するにはFillObject()
内でこのインターフェイスにあなたの共通のプロパティ、その後、型キャストを含むインターフェースを作成することをお勧めします。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace SO566510
{
interface IMyProperties
{
int Property1 { get; set; }
int Property2 { get; set; }
}
class SomeClassType1 : IMyProperties
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
class SomeClassType2 : IMyProperties
{
public int Property1 { get; set; }
public int Property2 { get; set; }
}
class Program
{
static void Main(string[] args)
{
var obj1 = new SomeClassType1();
var obj2 = new SomeClassType2();
FillObject(obj1, 10, 20);
FillObject(obj2, 30, 40);
}
private static void FillObject(IMyProperties objWithMyProperties
, int arg1, int arg2)
{
objWithMyProperties.Property1 = arg1;
objWithMyProperties.Property2 = arg2;
}
}
}
private void FillObject(Object MainObject, Foo Arg1, Bar Arg2)
{
Type t = MainObject.GetType();
t.GetProperty("Property1").SetValue(MainObject, Arg1, null);
t.GetProperty("Property2").SetValue(MainObject, Arg2, null);
}
一部のアイデア:
- 両方の種類からは継承し、同じタイプの共通性
- 両方の種類を実装インタフェースの共通性
- 使用反射プロパティを設定で設定して(もしくは醜いものの分)
- 用の新しい 動的 特徴, しかし、このようなアドレスをお
の代わりにキャストしようとしているのは、おそらくあなたは、リフレクションを使用してプロパティを設定してみてください可能性があります。
私は動的にASP.NET MVCアプリでリフレクションを使用してオブジェクトをキャストしています。基本的に、私は、クラスのプロパティを列挙し、データストア内の対応する値を検索し、値を動的にキャストし、オブジェクトのインスタンスに割り当てます。私のブログの記事を参照してください。 .NET の
とダイナミックキャスト