В основном, как следует из названия:
[DataContract(Name = "{0}Item")] //This will format properly
public class GenericItem<T>
{
[DataMember(Name = "The{0}")] //This will NOT format properly
public T TheItem { get; set; }
}
[CollectionDataContract(Name = "{0}Items")] //This will format properly
public SpecialCollection<T> : Collection<T> { }
[ServiceContract(Name = "{0}Service")] //This will NOT format properly
public interface IGenericService<T>
{
[OperationContract(Name = "Get{0}")] //This will NOT format properly
GenericItem<T> Get<T>();
}
Итак, вот оно... что работает, а что нет... но вопрос в том... почему? Очевидно, что .NET может создавать конкретный тип и форматировать имя, когда используя DataContract
и CollectionDataContract
и указывая тип (т.е. GenericItem<Foo>
или SpecialCollection<Foo>
. Так почему бы не сделать так, чтобы DataMember
тоже не форматировалось?
ServiceContract/OperationContract
я могу понять так, как он оставлен выше (типа), но чего я не понимаю, так это того, что когда вы даете ему конкретный тип, операции все равно не будут работать должным образом:
[ServiceContract(Name = "FooService")]
public interface FooService : IGenericService<Foo> { }
public interface IGenericService<T>
{
[OperationContract(Name = "Get{0}")] //This will NOT format properly
T Get<T>();
}
Опять же, почему? Очевидно, я объявляю здесь конкретный тип Foo, что означает, что IGenericService является IGenericService‹Foo›, поэтому не следует ли форматировать имя OperationContract, поскольку оно ЗНАЕТ тип?
Обновлять:
Я только что вспомнил, почему я был расстроен из-за невозможности использовать общий формат ServiceContract... когда у меня есть реализация службы, я даю ей конкретный тип...
//See! I gave it a concrete type to go by!
[ServiceBehavior(...)]
public class MyService : IGenericService<Foo> { ... }
Я создал Microsoft Connect а> запрос на это. Пожалуйста, проголосуйте, если вы хотите использовать эту функцию для других атрибутов. http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/2327048-enable-generics-for-datamemberattribute-serviceco
List<string>
иList<DateTime>
, оба имеют имя контракта данных List, поэтому они должны были сделать это, чтобы заставить WCF работать внутри. Было бы интересно просмотреть код в Reflector или любом другом инструменте и посмотреть, где они это реализовали. Какой бы класс ни читал атрибутыDataContract
иDataCollectionContract
, он должен отличаться от того, который читает остальные. - person CodingWithSpike   schedule 29.06.2011