C # - Динамически сгенерированные классы? - PullRequest
2 голосов
/ 19 января 2011

Мне нужно создать динамически расширяемый класс в C #. Цель состоит в том, чтобы создать класс, который может содержать всю информацию о данном контакте из таблицы контактов Android SQLite. Структура таблицы довольно странная, так как она не имеет заданных имен полей, но использует столбцы «имя поля» и «содержимое поля».

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

{
    this.(variableNames[i].ToString()) = variableContent[i];
}

не сделает этого), что является наименее ресурсоемким, но самым быстрым (и самым простым) способом.

А также, если мы здесь, есть ЛЮБОЙ метод для вызова типа (скажем, я создаю новый контакт с тегами электронной почты, рабочего места, имени и изображения, но имена этих переменных неизвестны) ВСЕ sub Переменные (Contact.image, Contact.FirstName, Contact.Email и т. д.) динамически?

Конечно, будут стандартные поля, которые должны быть во ВСЕХ контактах (одно из трех имен, номер телефона, адрес электронной почты @work и @home и т. Д.), Но они также должны вызываться динамически.

Ответы [ 3 ]

5 голосов
/ 19 января 2011

Вместо этого используйте Dictionary<string,string>.

Dictionary<string,string> contactInfo = new Dictionary<string,string>();

public void ImportContact()
{
    ...
    // for each fieldName and fieldValue from your table
    contactInfo.Add(fieldName, fieldValue);
    ...
    // check that all standard fields are present, if desired
}

public string FirstName
{
    get { return contactInfo["FirstName"]; }
}
2 голосов
/ 19 января 2011

Если вы хотите использовать динамическую типизацию, вы можете использовать тип dynamic в C # 4. Вы можете использовать ExpandoObject или DynamicObject в качестве основы для типов контактов .

Вот пример класса Contact, который может работать как статически типизированным с некоторыми предопределенными свойствами; и может иметь свойства, прикрепленные к нему во время выполнения. При статической обработке вы все равно можете получить значения с помощью индексатора:

class Contact : DynamicObject
{
    private readonly Dictionary<string, object> bag = new Dictionary<string, object>();
    public string FirstName { get; set; }

    public string LastName { get; set; }

    public object this[string key]
    {
        get { return bag[key]; }
        set { bag[key] = value; }
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (bag.ContainsKey(binder.Name))
        {
            result = bag[binder.Name];
            return true;
        }
        return base.TryGetMember(binder, out result);
    }

    public override bool TrySetMember(SetMemberBinder binder, object value)
    {
        bag[binder.Name] = value;
        return true;
    }
}

Который вы затем можете использовать так:

    // Contact is statically typed.
    Contact c = new Contact();
    c.FirstName = "test";       

    // Treat as dynamic and attach some extra properties:
    dynamic dynContact = c;
    dynContact.AddressOne = "Somewhere";
    dynContact.AddressTwo = "Someplace else";
    Console.WriteLine(dynContact.AddressOne); 
    Console.WriteLine(dynContact.AddressTwo); 

Кроме использования dynamic, вы не можете создать новый класс с динамически типизированными свойствами. В конце концов, как бы вы потребляли эти свойства? Возможно, вам лучше создать класс, содержащий свойства, которые вы должны иметь; и положите остальные в Dictionary<string,object>.

0 голосов
/ 19 января 2011

Если вы используете .NET 4.0, есть динамическая поддержка.Вы можете создавать объекты примерно так:

var newContact = new object { FirstName = "name", LastName = "name", etc... };

В качестве альтернативы, вы можете попробовать использовать словарь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...