Forums Neueste Beiträge
 

Dynamisches Array vom Typ Type und Objekte hinzufügen

26/11/2009 - 20:38 von Markus Fischer | Report spam
Hallo,

wie mache ich ein dynamisches Array vom Typ Type?
Ich weiß noch nicht, wei viele Type ich habe, deshalb dynamisch.
Da das Casten nicht klappt, habe ich das gewàhlt,
funktioniert nur für 2 Typen.




public FactoryMES(string folder)
{
System.Type[] types = new System.Type[] { typeof(Type),
typeof(Type) };

types.SetValue(type, index);
Problem, es gibt ja kein add oder sonstiges

Hat jemand einen Tipp?

Danke.

Es funktioniert jetzt perfekt für 2 Typen.
http://www1.minpic.de/bild_anzeigen.php?id•732&keyQ412455&ende


Grüße Markus

Die 2 Klassen komplett

/// <summary>
/// MES Factory
/// </summary>
public class FactoryMES : IFactoryMES
{
BaseMES ActualMES; // { get; set; }

public FactoryMES(string folder)
{
System.Type[] types = new System.Type[] { typeof(Type),
typeof(Type) };

List<IMES> list = GetPlugins<IMES>(folder, types);
//System.Collections.ArrayList list = GetPlugins(folder);

//ActualMES = (BaseMES)list[0];
//return;

//System.Collections.ArrayList list = new
System.Collections.ArrayList();
System.Type typeSelected = null;
switch (list.Count)
{
case 0:
System.Windows.Forms.MessageBox.Show("keine MES
Anbindung gefunden");
break;
case 1:
typeSelected = (System.Type)list[0];
break;
default:
//System.Type[] types = new System.Type[list.Count];
//list.CopyTo(types);
// list.CopyTo(types);
//types.SetValue((IMES)list[0], 0);
//types.SetValue(list[1], 0);

frmSelectorMES frmSelector = new frmSelectorMES();
frmSelector.Types = types;
frmSelector.List_IMES = list;
if (System.Windows.Forms.DialogResult.OK ==
frmSelector.ShowDialog())
typeSelected = types[frmSelector.SelectedIndex];
break;
}

if ( null == typeSelected )
return;

// create an instance
object o1 = System.Activator.CreateInstance(typeSelected);
ActualMES = (Rommel.Communication.Definitions.Core.BaseMES)o1;
}



/// <summary>
/// Gets the object.
/// </summary>
/// <param name="type">The type.</param>
/// <returns></returns>
public BaseMES GetObject(int type)
{
return ActualMES;

BaseMES base1 = null;
switch (type)
{
case 1:
base1 = new DummyMES();
break;
case 2:
//base1 = new Kunde_1_MES();
break;
}
return base1;
}

/// <summary>
/// Gets the configuration.
/// </summary>
/// <returns></returns>
public int GetConfiguration()
{
return 1;
}

public List<T> GetPlugins<T>(string folder, System.Type[] types)
//public System.Collections.ArrayList GetPlugins(string folder)
{
string[] files = Directory.GetFiles(folder, "*.dll");
List<T> tList = new List<T>();
//System.Collections.ArrayList tList = new
System.Collections.ArrayList();

Debug.Assert(typeof(T).IsInterface);
//Debug.Assert(typeof(IMES).IsInterface);

int index = 0;
foreach (string file in files)
{
try
{
Assembly assembly = Assembly.LoadFile(file);
foreach (Type type in assembly.GetTypes())
{
if (!type.IsClass || type.IsNotPublic)
continue;

Type[] interfaces = type.GetInterfaces();
if
(((System.Collections.IList)interfaces).Contains(typeof(T)))
//if
(((System.Collections.IList)interfaces).Contains(typeof(IMES)))
{
object obj = Activator.CreateInstance(type);
types.SetValue(type, index);

T t = (T)obj;
//IMES t = (IMES)obj;
tList.Add(t);
index++;
}
}
}
catch (Exception ex)
{
//LogError(ex);
}
}
return tList;
}
}


++++++++++++++++++++++++++++ Auswahlbox -
public partial class frmSelectorMES : Form
{
public System.Type[] Types;

public List<IMES> List_IMES;

public int SelectedIndex = 0;



public frmSelectorMES()
{
InitializeComponent();
}

private void frmSelectorMES_Load(object sender, EventArgs e)
{
//System.Type type1;
//type1 = typeof(IMES);

System.Drawing.Size size = lvTypes.ClientSize;
lvTypes.Columns[0].Width = size.Width * 33 / 100;
lvTypes.Columns[1].Width = size.Width * 33 / 100;
lvTypes.Columns[2].Width = size.Width * 33 / 10;

foreach (System.Type type in Types)
//foreach (IMES imes in List_IMES)
{
// Type a = (Type)imes;

if (type == null)
break;

//type1 = (System.Type)(imes);
System.Reflection.Assembly ass = type.Assembly;
System.Reflection.AssemblyName assName =
System.Reflection.AssemblyName.GetAssemblyName(ass.Location);

System.Windows.Forms.ListViewItem item =
lvTypes.Items.Add(type.Name);
item.SubItems.Add(new
System.IO.FileInfo(ass.Location).Name);
item.SubItems.Add(assName.Version.ToString());

// lvTypes.Items.Add(imes.GetType().ToString());
string strTooltip = string.Format("{1}{0}{2}{0}{3}",
System.Environment.NewLine,
type.FullName,
ass.Location,
ass.FullName);
item.ToolTipText = strTooltip;
}

lvTypes.SelectedIndices.Add(this.SelectedIndex);
}

private void btnOK_Click(object sender, EventArgs e)
{
if (lvTypes.SelectedIndices.Count != 1)
{
System.Windows.Forms.MessageBox.Show("Sie müssen einen
Datentyp anwàhlen, um die zu verwendende Maschine festzulegen");
DialogResult = DialogResult.None;
}
else
{
SelectedIndex = lvTypes.SelectedIndices[0];
this.DialogResult = DialogResult.OK;
}
}
}
 

Lesen sie die antworten

#1 Michael v. Fondern
26/11/2009 - 21:30 | Warnen spam
Hallo Markus,
Hallo,

wie mache ich ein dynamisches Array vom Typ Type?



na, als List<Type> halt. Aber dein Code hat wohl noch ein paar Probleme:

List<IMES> list = GetPlugins<IMES>(folder, types);
// ...
case 1:
typeSelected = (System.Type)list[0];

wird so nicht gehen. Denn "GetPlugins" liefert dir keine Objekte vom Typ
"System.Type", sondern Objekte vom Typ IMES. Funktionieren würde sicher

typeSelected = list[0].GetType();

aber ich schàtze mal, das du das gar nicht so umstàndlich brauchst. Bau
dir doch "GetPlugins" gleich so, dass es dir eine Liste der Typen aus
der geladenen DLL zurückliefert, die den Anforderungen entsprechen. Also
anstelle von
public List<T> GetPlugins<T>(string folder, System.Type[] types)
{
// ...
List<T> tList = new List<T>();
// ...
object obj = Activator.CreateInstance(type);
types.SetValue(type, index);
T t = (T)obj;
tList.Add(t);
// ...
}
besser gleich

public List<Type> GetPlugins<T>(string folder)
{
List<Type> tList = new List<Type>();
// ... hier in etwa der vorhandene Code
// ..
// ... hier kein "Activator.CreateInstance(type)" mehr !!
// stattdessen direkt
tList.Add(type);
//.. und am Ende der Schleife
return tList;
}

Grüße

- Michael -

Ähnliche fragen