У меня есть общий класс Repository <T>, который я хочу использовать с ObjectDataSource. Repository <T> находится в отдельном проекте под названием DataAccess. Согласно это сообщение из групп новостей MS (соответствующая часть скопирована ниже):
Internally, the ObjectDataSource is calling Type.GetType(string) to get the type, so we need to follow the guideline documented in Type.GetType on how to get type using generics. You can refer to MSDN Library on Type.GetType:
http://msdn2.microsoft.com/en-us/library/w3f99sx1.aspx
From the document, you will learn that you need to use backtick (`) to denotes the type name which is using generics.
Also, here we must specify the assembly name in the type name string.
So, for your question, the answer is to use type name like follows:
TypeName = "TestObjectDataSourceAssembly.MyDataHandler`1[System.String],TestObjectDataSourceAssembly"
Ладно, имеет смысл. Однако, когда я пытаюсь это сделать, страница выдает исключение:
<asp:ObjectDataSource ID = "MyDataSource" TypeName = "MyProject.Repository`1[MyProject.MessageCategory],DataAccess" />
[InvalidOperationException: The type specified in the TypeName property of ObjectDataSource 'MyDataSource' could not be found.]
Любопытно, что это происходит только тогда, когда я просматриваю страницу. Когда я открываю диалоговое окно «Настроить источник данных» в конструкторе VS2008, оно правильно показывает мне методы в моем универсальном классе репозитория. Передача строки TypeName в Type.GetType () во время отладки также возвращает допустимый тип. Так что же дает?





Сделайте что-нибудь подобное.
Type type = typeof(Repository<MessageCategory);
string assemblyQualifiedName = type.AssemblyQualifiedName;
получить значение assemblyQualifiedName и вставить его в поле TypeName. Обратите внимание, что Type.GetType (string), передаваемое значение должно быть
The assembly-qualified name of the type to get. See AssemblyQualifiedName. If the type is in the currently executing assembly or in Mscorlib.dll, it is sufficient to supply the type name qualified by its namespace.
Таким образом, он может работать, передав эту строку в ваш код, потому что этот класс находится в выполняющейся в данный момент сборке (где вы его вызываете), тогда как ObjectDataSource - нет.
Скорее всего, вы ищете
MyProject.Repository`1[MyProject.MessageCategory, DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null], DataAccess, Version=1.0.0.0, Culture=neutral, PublicKey=null
Даррен,
Большое, большое спасибо за ваш пост. Я борюсь с этим весь день. Как ни странно, в моем случае мне нужно удвоить квадратные скобки, например для вашего фрагмента кода:
MyProject.Repository`1 [[MyProject.MessageCategory, DataAccess, Version = 1.0.0.0, Culture = нейтральный, PublicKey = null]], DataAccess, Version = 1.0.0.0, Culture = нейтральный, PublicKey = null
Роджер
Я знаю, что это старый пост, но я сам недавно столкнулся с этой проблемой. Другим решением было бы заменить наследование композицией объекта, например.
[DataObject]
public class DataAccessObject {
private Repository<MessageCategory> _repository;
// ctor omitted for clarity
// ...
[DataObjectMethod(DataObjectMethodType.Select)]
public MessageCategory Get(int key) {
return _repository.Get(key);
}
}
Таким образом, ObjectDataSource не знает о репозитории, потому что он скрыт внутри класса. У меня есть библиотека классов на уровне фасада, что является вполне разумным местом для размещения этого кода в проекте, над которым я работаю.
Кроме того, если вы используете Resharper и интерфейсы, можно заставить Resharper выполнить рефакторинг с помощью функции Resharpers «Реализовать с помощью поля».
<% Response.Write (typeof (YourClassName) .AssemblyQualifiedName); %>