2013-11-27 5 views
-3

У меня есть следующий классОбщий список <Type> для ENUM

public partial class ActionType 
{ 
    public System.Guid ActionTypeId { get; set; } 
    public string ActionTypeName { get; set; } 
} 

Теперь я хочу, чтобы использовать все ActionTypes, хранящиеся в базе данных, как это:

MyEntity entity = new MyEntity(); 
entity.ActionTypeId = ActionTypes.??? 

здесь я хочу, чтобы иметь возможность выбрать ActionTypeId by ActionTypeName.

Теперь я делаю это так:

public class ActionTypes 
{ 
    public static readonly Guid CustomerAdded = new Guid("36520b53-e1d0-4c96-bec8-0df85536a96b"); 
    public static readonly Guid CustomerEdited = new Guid("732592d3-7423-4250-aa74-e10fe1e7c030"); 
} 

Я хочу, чтобы иметь возможность создавать ActionTypes programmaticaly из базы данных, а не писать значения самостоятельно.

Так что я хочу сделать что-то вроде:

public class ActionTypes 
{ 
    List<ActionType> list = context.GetAllActionTypes(); 
    foreach(ActionType type in list) 
    { 
     public static readony Guid type.ActionTypeName = type.ActionTypeId; 
    } 
} 

Как я могу осуществить то, что я намерен?

наилучшими пожеланиями

+0

Я не уверен, я понимаю. Помогает ли 'Словарь '? – knittl

+2

Непонятно, что вы здесь задаете. У кода, который у вас есть, что вы хотите по-другому? –

+0

Извините, ребята, я отредактировал вопрос – user3041845

ответ

0

Может быть, словарь (Lookup-таблица, карта) является то, что вам нужно?

public class ActionTypes 
{ 
    private List<ActionType> list = context.GetAllActionTypes(); 
    private Dictionary<string, Guid> ActionTypesMap { get; private set; } 

    public ActionTypes() { 
    this.ActionTypesMap = list.ToDictionary(
     k => k.ActionTypeName, 
     v => v.ActionTypeId); 
    } 
} 

доступ как: Guid addedGuid = new ActionTypes().ActionTypesMap ["CustomerAdded "]

+0

. Я могу добиться того же путем: Guid addedGuid = list.FirstOrDefault (x => x.ActionTypeName == "CustomerAdded"). ActionTypeId; – user3041845

+0

Что я хочу сделать, так это избежать жесткого кодирования «CustomerAdded» – user3041845

+0

. Тогда как вы хотите обратиться к своим типам действий? Вы должны как-то узнать это имя. Я знаю, что вы можете сделать это с помощью FirstOrDefault (словарь быстрее, но использует больше памяти). – knittl

0

Вы можете использовать шаблон T4 для генерации файла во время компиляции. Это имеет дополнительное преимущество: поддерживать Intellisense и проверять имена участников.

Что-то вроде этого:

ActionTypes.tt:

<#@ template language = "C#"       #> 
<#@ assembly name  = "Microsoft.CSharp"    #> 
<#@ assembly name  = "System.Core"     #> 
<#@ assembly name  = "System.Data"     #> 
<#@ import  namespace = "System.Collections.Generic" #> 
<#@ import  namespace = "System.Dynamic"    #> 
<#@ import  namespace = "System.Linq"     #> 
<#@ import  namespace = "System.Data.SqlClient"  #> 

public class ActionTypes 
{ 
<# 
var con = new SqlConnection("Data Source=localhost\SQLExpress;Initial Catalog=MyDatabaseName;Integrated Security=True"); 
con.Open(); 

var sqc = new SqlCommand("SELECT ActionTypeID, ActionTypeName FROM ActionTypes", con); 
var reader = sqc.ExecuteReader(); 

using (var reader = sqc.ExecuteReader()) 
{ 
    while (reader.Read()) 
    { 
#> 
    public static Guid <#=reader.GetString(reader.GetOrdinal("ActionTypeName"))#> = new Guid("<#=reader.GetGuid(reader.GetOrdinal("ActionTypeID"))#>"); 
<# 
    } 
} 
con.Close(); 
#> 
} 
Смежные вопросы