2017-10-26 1 views
0

私は抽象クラスDeviceを持っています。特定のデバイスを表す多数のクラスが派生しています。たとえば、 class RedDevice : Device,class BlueDevice : Deviceなどです。これらはすべてFoo.Devices名前空間に格納されています。ここでは構造の概要を示します:リフレクションを使用してネームスペース内のすべてのクラスのリストを作成し、その実タイプにキャスト

- Foo 
| ↳ Devices (folder) 
| | ↳ RedDevice 
| | ↳ BlueDevice 
| ↳ Device 

Device.cs

internal abstract class Device 
{ 
    internal string Path { get; set; } 
} 

RedDevice.cs

class RedDevice 
{ 
    internal RedDevice() 
    { 
     this.Path = "/path"; 
    } 
} 

私はFoo.Devicesの下ですべてのデバイスのリストを作成したい、自分の親クラスDeviceにキャスト。

List<System.Type> deviceTypes = 
    Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Namespace == 
    typeof(RedDevice).Namespace).ToList(); 

しかし、どのように私はDeviceにそれらをキャストすることができます:私は、次のコードを使用してTypeのリストを得ることができますか?ダイレクトキャストはコンパイラによって許可されておらず、他のすべてが間違った型の例外をスローします。ありがとう!

+0

タイプオブジェクトは、型(クラス)に関するメタデータを保持します。そのクラスの実際のインスタンスではありません。 – thehennyy

答えて

0

問題は、私はinternalコンストラクタを持っていたとSystem.Activatorは、クラスのインスタンスを作成できませんでした。

2

deviceTypesリストには、クラスインスタンスではなく、タイプ(クラス定義)が含まれています。したがって、それらをDeviceにキャストする前に、それらのインスタンスを作成する必要があります。

彼らはパラメータなしのコンストラクタを持っている場合は、使用することができます。

List<Device> devices = new List<Device>(); 
foreach (Type deviceType in deviceTypes) 
{ 
    devices.Add((Device)Activator.CreateInstance(deviceType)); 
} 

クラスの一つは、コンストラクタのパラメータを必要とした場合は、おそらく難しいこれらを供給する方法を考え出すされます。

+0

私はこれを既に試みましたが、「未処理の例外が発生しました。それ以上の説明やスタックトレースはありません。これをサポートしていないXamarinのMonoですか? – DoDo

+1

処理されない例外の例外メッセージは何ですか? – thehennyy

+0

残念ながら、デバッガは私にさらなる詳細を教えてくれないようです。 – DoDo

0

このような方法を使用すると、すべてのアセンブリから検索できます。解決しよう

List<Device> GetDevices() 
    { 
     List<Device> devices = new List<Device>(); 
     var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 

     foreach (Assembly assembly in assemblies) 
     { 
      try 
      { 
       foreach (var ti in assembly.DefinedTypes) 
       { 

        if (ti.BaseType == typeof(Device)) 
        { 
        devices.Add((Device)assembly.CreateInstance(ti.FullName)); 
        } 
       } 
      } 
      catch 
      { } 
     } 
     return devices; 
    } 
関連する問題