Temat: Wywołanie metody obiektu zawartego w kolekcji
no to jeśli komuś chce się pobawić to można to zrobic tak;)
Testowa klasa MyType, z której chcemy wykonać metody:
public class MyType
{
public bool Test1()
{ return false;}
public void Test2()
{}
public void Test3(int x, string f)
{}
}
Teraz w jakimś tam miejscu piszemy sobie metodę do wykonywania metod z list :
public X ReturnSomthOrNoth<T, X>(IList list,int index, string methodName, object[] userParameters)
{
X instance = (X)Activator.CreateInstance(typeof(X));
try
{
Type thisType = typeof(T);
MethodInfo theMethod = thisType.GetMethod(methodName);
object t = null;
if (list != null)
{
if (list.Count - 1 >= index)
{
if (list[index] is T)
{
t = theMethod.Invoke((T)list[index], userParameters);
}
else
throw new InvalidCastException();
}
else
throw new IndexOutOfRangeException();
}
else
throw new NullReferenceException();
if (t != null)
if (t is X)
instance = (X)t;
else
throw new InvalidCastException();
}
catch (TargetParameterCountException arEx)
{
throw new Exception("Wrong number or type of parameters");
}
return instance;
}
No i teraz testowe użycie metod, w jakimś dogodnym dla nas miejscu:
//Test
ArrayList myArrayList = new ArrayList();
myArrayList.Add(new MyType());
//return some type
bool resTest = ReturnSomthOrNoth<MyType, bool>(myArrayList, 0, "Test1", null);
//void without parameters
ReturnSomthOrNoth<MyType,object>(myArrayList, 0, "Test2", null);
//with parameters
ReturnSomthOrNoth<MyType,object>(myArrayList, 0, "Test3", new object[] { 2, "4" });
Pewnie można by zrobić jeszcze parę fajnych rzeczy, ale póki co i tak sprawdza się:)
Jeśli metoda jest typu void to wystrczy w typie X wpisać object :)
Ewentualnie metoda która bezpośrednio wykona metodę obiektu:
public X ReturnSomthOrNoth<T, X>(T objectToUse, int index, string methodName, object[] userParameters)
{
X instance = (X)Activator.CreateInstance(typeof(X));
try
{
Type thisType = typeof(T);
MethodInfo theMethod = thisType.GetMethod(methodName);
object t = null;
t = theMethod.Invoke(objectToUse, userParameters);
if (t != null)
if (t is X)
instance = (X)t;
else
throw new InvalidCastException();
}
catch (TargetParameterCountException arEx)
{
throw new Exception("Wrong number or type of parameters");
}
return instance;
}
Testowe użycie, tutaj już z try i catch na zewnątrz, ale za to bardziej uniwersalnie:)
//object of MyType
try
{
ReturnSomthOrNoth<MyType, object>((MyType)myArrayList[0], 0, "Test3", new object[] { 2, "4" });
}
catch (NullReferenceException ex)
{ }
catch (IndexOutOfRangeException ex)
{ }
catch (InvalidCastException ex)
{ }
Łukasz Machowski edytował(a) ten post dnia 26.05.10 o godzinie 13:29