C # PropertyInfo (универсальный) - PullRequest
       12

C # PropertyInfo (универсальный)

4 голосов
/ 24 августа 2009

Допустим, у меня есть этот класс:

class Test123<T> where T : struct
{
    public Nullable<T> Test {get;set;}
}

и этот класс

class Test321
{
   public Test123<int> Test {get;set;}
}

Итак, давайте решим, что я хочу создать Test321 с помощью отражения и установить «Test» со значением, как мне получить универсальный тип?

Ответы [ 3 ]

15 голосов
/ 24 августа 2009

Поскольку вы начинаете с Test321, самый простой способ получить тип из свойства:

Type type = typeof(Test321);
object obj1 = Activator.CreateInstance(type);
PropertyInfo prop1 = type.GetProperty("Test");
object obj2 = Activator.CreateInstance(prop1.PropertyType);
PropertyInfo prop2 = prop1.PropertyType.GetProperty("Test");
prop2.SetValue(obj2, 123, null);
prop1.SetValue(obj1, obj2, null);

Или вы имеете в виду, что хотите найти T?

Type t = prop1.PropertyType.GetGenericArguments()[0];
0 голосов
/ 24 августа 2009

Попробуйте что-то вроде этого:

using System;
using System.Reflection;

namespace test {

    class Test123<T> 
        where T : struct {
        public Nullable<T> Test { get; set; }
    }

    class Test321 {
        public Test123<int> Test { get; set; }
    }

    class Program {

        public static void Main() {

            Type test123Type = typeof(Test123<>);
            Type test123Type_int = test123Type.MakeGenericType(typeof(int));
            object test123_int = Activator.CreateInstance(test123Type_int);

            object test321 = Activator.CreateInstance(typeof(Test321));
            PropertyInfo test_prop = test321.GetType().GetProperty("Test");
            test_prop.GetSetMethod().Invoke(test321, new object[] { test123_int });

        }

    }
}

Проверьте это Обзор отражений и обобщений на MSDN.

0 голосов
/ 24 августа 2009

Это должно сделать это более или менее. У меня сейчас нет доступа к Visual Studio, но он может дать вам некоторое представление о том, как создать экземпляр универсального типа и задать свойство.

// Define the generic type.
var generic = typeof(Test123<>);

// Specify the type used by the generic type.
var specific = generic.MakeGenericType(new Type[] { typeof(int)});

// Create the final type (Test123<int>)
var instance = Activator.CreateInstance(specific, true);

И установить значение:

// Get the property info of the property to set.
PropertyInfo property = instance.GetType().GetProperty("Test");

// Set the value on the instance.
property.SetValue(instance, 1 /* The value to set */, null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...