Передача объекта и его типа в метод - PullRequest
0 голосов
/ 02 октября 2010

У меня есть три класса: SomeThing, SomeOtherThing и YetAntherThing. У всех трех есть идентичный член под названием Свойства. В каждом классе это пара ключ / значение, так что я могу ссылаться на obj1.Name, obj1.Value, obj2.Name, obj2.Value, obj3.Name и obj3.Value. Я хотел бы передать эти три объекта в один метод, который мог бы перебирать их соответствующие коллекции «Properties» без необходимости знать во время компиляции, над чем он работал. Я представляю что-то вроде:

SomeThing obj1;
SomeOtherThing obj2;
YetAntherThing obj3;

DoProperties( obj1, obj1.GetType() );
DoProperties( obj2, obj2.GetType() );
DoProperties( obj3, obj3.GetType() );

...

private void DoProperties( object obj, Type objectType )
{
    // this is where I get lost. I want to "cast" 'obj' to the type
    // held in 'objectType' so that I can do something like:
    //
    // foreach ( var prop in obj.Properties )
    // {
    //    string name = prop.Name;
    //    string value = prop.Value;
    // }
}

Примечание: классы SomeThing, SomeOtherThing и YetAntherThing определены внешне, я не имею над ними никакого контроля или доступа к их исходному коду, и все они запечатаны.

Ответы [ 2 ]

7 голосов
/ 02 октября 2010

У вас есть два варианта;либо заставьте каждый класс реализовать интерфейс, который предоставляет коллекцию, например:

interface IHasProperties
{
    PropertyCollection Properties {get;}
}

Затем объявите свой метод, ссылаясь на этот интерфейс:

private void DoProperties(IHasProperties obj)
{
    foreach (var prop in obj.Properties)
    {
        string name = prop.Name;
        string value = prop.Value;
    }
}

Или используйте отражение для поискаКоллекция свойств во время выполнения, например:

private void DoProperties(object obj)
{
    Type objectType = obj.GetType();

    var propertyInfo = objectType.GetProperty("Properties", typeof(PropertyCollection));

    PropertyCollection properties = (PropertyCollection)propertyInfo.GetValue(obj, null);

    foreach (var prop in properties)
    {
        //    string name = prop.Name;
        //    string value = prop.Value;
    }
}
2 голосов
/ 02 октября 2010

Интерфейс, упомянутый FacticiusVir, является подходящим вариантом, если у вас есть контроль над источником каждого объекта. В отсутствие этого есть третий вариант в .NET 4. dynamic.

Дано

class A
{
    public Dictionary<string, string> Properties { get; set; }
}

class B
{
    public Dictionary<string, string> Properties { get; set; }
}

class C
{
    public Dictionary<string, string> Properties { get; set; }
}

Вы можете принять параметр как тип dynamic, и ваш код скомпилируется (и будет бомбить во время выполнения, если он недействителен).

static void DoSomething(dynamic obj)
{
    foreach (KeyValuePair<string, string> pair in obj.Properties)
    {
        string name = pair.Key;
        string value = pair.Value;
        // do something
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...