2013-08-24 2 views
3

У меня есть класс, который использует общие свойства. Например:C# Использование отражения с общим свойством

class Person 
{ 
    public MyGenericProperty<string> Field1 
    { 
     get { return field1; } 
     set { field1 = value; } 
    } 

    private MyGenericProperty<string> field1= new MyInheritedGenericProperty<string>("Alan1"); 
} 

Я хочу использовать этот класс с отражением в другом классе и у меня есть метод, как тот

public void DoSomethingWithProperty(object sourceobject) 
{ 
    foreach (var aProperty in sourceobject.GetType().GetProperties()) 
    { 
     *if(aProperty.PropertyType == typeof(MyGenericProperty<>))* 
     { 
      *var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null);* 
     } 
    } 
    return null; 
} 

У меня есть две проблемы

1- Как сделать проверку типа общей собственности. В этом примере код if(aProperty.PropertyType == typeof(MyGenericProperty<>)) не работает.

2- Т MyGenericProperty может быть любой класс, и как можно бросить класс MyGenericProperty без знающего T путем отражения в

var obj = (MyGenericProperty<>)aProperty.GetValue(sourceobject, null); 

Благодарить за помогает.

ответ

7

Во-первых, важно понимать, что у вас нет «общей собственности» - нет такой вещи. У вас есть свойство, тип которого является общим типом ... и это не одно и то же. (Сравните это с общим типом или универсального метода, каждый из которых является действительно родовым с точки зрения введения новых параметров типа.)

Вы можете протестировать его с помощью этого кода:

if (aProperty.PropertyType.IsGenericType && 
    aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>)) 

но как для кастинг - это зависит от того, что вы хотите сделать со значением после этого. Возможно, вы захотите объявить базовый тип non-generic MyGenericProperty<>, содержащий все члены, которые не зависят от параметра типа. Обычно я давал бы то же имя, что и общий тип (например, MyGenericProperty), без указания его параметров типа. Тогда, если вам нужен только один из этих элементов, вы можете использовать:

if (aProperty.PropertyType.IsGenericType && 
    aProperty.GetGenericTypeDefinition() == typeof(MyGenericProperty<>)) 
{ 
    var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null); 
    // Use value 
} 

Но в этом случае вы можете использовать Type.IsAssignableFrom все равно:

if (typeof(MyGenericProperty).IsAssignableFrom(aProperty.PropertyType)) 
{ 
    var value = (MyGenericProperty) aProperty.GetValue(sourceObject, null); 
    // Use value 
} 

Если эти советы не помогут вам, пожалуйста, дайте более подробную информацию о том, что вы пытаетесь сделать.