Работа с динамическими типами - PullRequest
2 голосов
/ 15 мая 2009

Я использую модель сущности с базой данных SQL, и у меня есть набор из примерно 30 справочных таблиц в одном формате с тремя столбцами, ID , Текст , IsActive . Но вместо того, чтобы создавать 30 форм, я хотел бы создать одну форму и, в зависимости от имени строки данного типа, затем заполнить сетку и разрешить Вставить , Обновить или Удалить записей этого типа.

Я пытался

string objectType = "Namespace.Models.BenefitType";
object o = Assembly.GetExecutingAssembly().CreateInstance(objectType);
Type t = o.GetType();

но я не могу получить доступ к типу, я получаю сообщение о том, что это тип System.Type, а не BenefitType.

Может кто-нибудь посоветовать мне, как я могу разыграть тип, который неизвестен, пока не будет вызван динамически.

Большое спасибо

Ответы [ 2 ]

1 голос
/ 15 мая 2009

Я бы определенно выбрал интерфейс, а затем универсальный тип (или универсальные методы) вместо того, чтобы делать что-то по-настоящему динамически, если это возможно. Если ваш автоматически сгенерированный код использует частичные классы, это действительно легко сделать - просто напишите интерфейс вокруг того, что у вас есть, а затем добавьте новый файл с:

public partial class BenefitType : ICommonType {}
public partial class OtherType : ICommonType{} 
// etc

Тогда вы можете написать:

public class LookupForm<T> : Form where T : ICommonType, new()

и тебя нет. Недостатком является то, что дизайнер не очень доволен универсальными типами.

Если вам нужно использовать , основываясь только на имени типа, вы все равно можете сделать это:

string objectType = "Namespace.Models.BenefitType";
Type type = Type.GetType(objectType);
Type formType = typeof(LookupForm<>).MakeGenericType(type);
Form form = (Form) Activator.CreateInstance(formType);

Вы возможно хотите создать абстрактную неуниверсальную форму между LookupForm<T> и Form, которую вы можете использовать строго типизированным способом, но которая не имеет ничего общего с T , Это зависит именно от того, что вам нужно сделать.

0 голосов
/ 15 мая 2009

На данный момент ваши возможности ограничены. Фреймворк должен знать больше информации о типе, чем просто имя строки во время компиляции , чтобы можно было легко использовать их. Это означает, что нужно выполнить что-то вроде оператора switch в строке типа, что не очень хорошо, или убедиться, что все ваши динамические типы реализуют какой-то общий интерфейс, к которому вы можете привести (намного лучше).

В C # 4.0 вы сможете использовать ключевое слово dynamic для разрешения этих вызовов во время выполнения.

...