В вашей конфигурации udpInboundChannel
это DirectChannel. Если вы хотите, чтобы это был канал PubSub, просто объявите новый бин
@Bean
public MessageChannel udpInboundChannel() {
return new PublishSubscribeChannel();
}
У меня было время, поэтому я попытался решить свою проблему с помощью 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;
}
}
}
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); }
Хотя я должен опубликовать решение проблемы реального мира.
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 может быть «хорошим» решением.
Спасибо за все ответы.
Как насчет установки корневого значения в виде строки, а затем переноса его в виде строки, пока вам не понадобится преобразовать его в целевой тип?
Наличие переменной определенного типа действительно полезно только во время компиляции и не поможет вам во время выполнения использовать ее таким образом. Попытайтесь написать код, в котором вы бы использовали это ... вы обнаружите, что он продолжает выдвигать требование знать тип для времени компиляции на каком-то уровне (может быть, дальше по цепочке вызовов, но вам все равно придется вводить конкретный тип, чтобы это было полезно).
Однако следует помнить об одном - если ваш тип является ссылочным типом, объект по-прежнему действительно является типом, который вы создали. Не похоже, что есть преимущество в том, чтобы объект был сохранен как ваш тип по сравнению с объектом. В этом красота отражения (а также часть того, почему оно работает). На самом деле нет причин пытаться «изменить» его тип во время выполнения в приведении, поскольку он по-прежнему будет объектом.