unbekannte "object" variable auf generische Interfaces testen

26/06/2008 - 17:52 von Markus Springweiler | Report spam
Hallo,

Problem:
* eine Variable (bzw. Parameter) vom Typ "object"
* eine gegebenenfalls aufzurufende generische Methode:
public int Enumerable.Count<T>(IEnumerable<T> input);

Nachfolgender Code funktioniert zwar, enthàlt aber für meinen Geschmack
zuviel Reflection-Arbeit, speziell weil ich erst auf gut Glück den
richtigen Enumerable.Count-Overload finden muss.

Habe ich nützliche C# Sprachkonstrukte übersehen?

class Program
{
static void Main(string[] args)
{
var list = new string[] { "test", "zwei", "drei" };
DoSomethingStupid<string>(list);
DoSomething(list);
Console.ReadKey();
}

static void DoSomethingStupid<T>(object obj)
{
// nur der Blindtest mit fixer generischer Typangabe
var e = obj as IEnumerable<T>;
if ( e != null )
{
int count = Enumerable.Count<T>(e); // "<T>" ist hier optional
Console.WriteLine("blindtest {0} returns {1}", typeof(IEnumerable<T>), count);
}
}

static void DoSomething(object obj)
{
var genTyp = typeof(IEnumerable<>);
var intfs = from I in obj.GetType().GetInterfaces()
where I.IsGenericType && I.GetGenericTypeDefinition() == genTyp
select I;

var enumTyp = typeof(Enumerable);
var countMethod = (from M in enumTyp.GetMethods()
where M.Name == "Count" && M.GetParameters().Length == 1
select M
).Single();

foreach ( var intf in intfs )
{
var genTypeMember = intf.GetGenericArguments();
var MI = countMethod.MakeGenericMethod(genTypeMember);
var count = (int)MI.Invoke(null, new object[] { obj });
Console.WriteLine("{0} returns {1}", intf, count);
}
}
}

/\/\arkus.
 

Lesen sie die antworten

#1 Frank Dzaebel
28/06/2008 - 17:55 | Warnen spam
Hallo Markus,

Problem:
* eine Variable (bzw. Parameter) vom Typ "object"
* eine gegebenenfalls aufzurufende generische Methode:
public int Enumerable.Count<T>(IEnumerable<T> input);



Das Problem ist leider ungenau beschrieben, aber es
ist gut, dass Du den Code gepostet hast.

Was ist genau das Ziel, diese generische Methode
herauszufinden? Diese aufzurufen, oder irgendetwas anders?


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen