Бросьте свойство к его фактическому типу динамично с помощью отражения

В вашей конфигурации udpInboundChannel это DirectChannel. Если вы хотите, чтобы это был канал PubSub, просто объявите новый бин

 @Bean
 public MessageChannel udpInboundChannel() {
      return new PublishSubscribeChannel();
 }
26
задан Keith K 10 January 2013 в 15:48
поделиться

5 ответов

У меня было время, поэтому я попытался решить свою проблему с помощью VS2010, и я думаю, что раньше был прав, когда Я думал, что динамические клавиши «решат» мой вопрос. См. Приведенный ниже код.

using System.Reflection;

namespace TempTest
{
    public class ClassA
    {
        public int IntProperty { get; set; }
    }

    public class ClassB
    {
        public ClassB()
        {
            MyProperty = new ClassA { IntProperty = 4 };
        }
        public ClassA MyProperty { get; set; }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            ClassB tester = new ClassB();

            PropertyInfo propInfo = typeof(ClassB).GetProperty("MyProperty");
            //get a type unsafe reference to ClassB`s property
            dynamic property = propInfo.GetValue(tester, null);

            //casted the property to its actual type dynamically
            int result = property.IntProperty; 
        }
    }
}
7
ответ дан 28 November 2019 в 07:12
поделиться
public object CastPropertyValue(PropertyInfo property, string value) { 
if (property == null || String.IsNullOrEmpty(value))
    return null;
if (property.PropertyType.IsEnum)
{
    Type enumType = property.PropertyType;
    if (Enum.IsDefined(enumType, value))
        return Enum.Parse(enumType, value);
}
if (property.PropertyType == typeof(bool))
    return value == "1" || value == "true" || value == "on" || value == "checked";
else if (property.PropertyType == typeof(Uri))
    return new Uri(Convert.ToString(value));
else
    return Convert.ChangeType(value, property.PropertyType);  }
34
ответ дан Nisus 28 November 2019 в 07:12
поделиться

Хотя я должен опубликовать решение проблемы реального мира.

string objectType = "MyProperty";

using (MyEntitiesContext entitiesContext = new MyEntitiesContext())
{
try
{
    string queryString = @"SELECT VALUE " + objectType+  " FROM MyEntitiesContext." + objectType + " AS " + objectType + " WHERE " + objectType + ".id = @id";

    IQueryable<Object> query = entitiesContext.CreateQuery<Object>(queryString, new ObjectParameter("id", objectId));

    foreach (Object result in query)
    {
        return result;
    }
}
catch (EntitySqlException ex)
{
    Console.WriteLine(ex.ToString());
}
}

return null;

Я думаю, что новое динамическое ключевое слово CLR4 может быть «хорошим» решением.

Спасибо за все ответы.

1
ответ дан Keith K 28 November 2019 в 07:12
поделиться

Как насчет установки корневого значения в виде строки, а затем переноса его в виде строки, пока вам не понадобится преобразовать его в целевой тип?

1
ответ дан euwe 28 November 2019 в 07:12
поделиться

Наличие переменной определенного типа действительно полезно только во время компиляции и не поможет вам во время выполнения использовать ее таким образом. Попытайтесь написать код, в котором вы бы использовали это ... вы обнаружите, что он продолжает выдвигать требование знать тип для времени компиляции на каком-то уровне (может быть, дальше по цепочке вызовов, но вам все равно придется вводить конкретный тип, чтобы это было полезно).

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

1
ответ дан 28 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: