Как передать существующее перечисление в качестве параметра службы WCF? - PullRequest
0 голосов
/ 17 марта 2020

Я хочу передать значение типа enum моей службе WCF. Однако этот тип перечисления (например, SqlDbType) не создан мной, и я не могу его изменить. После поиска в Google я узнаю, что тип перечисления, переданный в качестве параметра службы WCF, должен быть добавлен DataContractAttribute, а его член должен быть добавлен EnumMemberAttribute. Интересно, возможно ли выполнить эту работу во время выполнения, например, при запуске службы. Вот мой код, который не работает:

public class AppInitializer
{
    public static void AppInitialize()
    {
        Type enumType = typeof(SqlDbType);
        Attribute[] dataContractAttribute = { new DataContractAttribute()};
        TypeDescriptor.AddAttributes(enumType, dataContractAttribute);
        Attribute[] enumMemberAttribute = { new EnumMemberAttribute() };
        foreach (object value in Enum.GetValues(enumType))
        {
            TypeDescriptor.AddAttributes(value, enumMemberAttribute);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

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

С учетом следующего перечисления третьей стороны:

enum ThirPartyEnum
{
    Zero = 0,
    One = 1,
    Two = 2
}

Создайте свой собственный способ таким образом:

[DataContract(Name = "MyEnum")]
enum MyEnum
{
    [Description("Zero")]
    [EnumMember]
    Zero= ThirPartyEnum.Zero,

    [Description("One")]
    [EnumMember]
    One = ThirPartyEnum.One,

    [Description("Two")]
    [EnumMember]
    Two = ThirPartyEnum.Two
}
0 голосов
/ 17 марта 2020

Возможно, следующее решение подойдет вам.

  1. Создайте свой собственный enum, который является копией SqlDbType, например,

      public enum MySqlDbType
            {
                BigInt = 0,
                Binary = 1,
                Bit = 2,
                Char = 3,
                DateTime = 4,
                Decimal = 5,
                Float = 6,
                Image = 7,
                Int = 8,
                Money = 9,
                NChar = 10,
                NText = 11,
                NVarChar = 12,
                Real = 13,
                UniqueIdentifier = 14,
                SmallDateTime = 15,
                SmallInt = 16,
                SmallMoney = 17,
                Text = 18,
                Timestamp = 19,
                TinyInt = 20,
                VarBinary = 21,
                VarChar = 22,
                Variant = 23,
                Xml = 25,
                Udt = 29,
                Structured = 30,
                Date = 31,
                Time = 32,
                DateTime2 = 33,
                DateTimeOffset = 34
            }
    
  2. Украсить enum MySqlDbType и его членов соответствующими атрибутами [DataContract] и [EnumMember].

  3. Создайте метод для преобразования.

            public static SqlDbType ConvertMySqlDbTypeToSqlDbType (MySqlDbType inputEnum)
            {
                 return (SqlDbType)Enum.Parse(typeof(SqlDbType), inputEnum.ToString());
            }
    
  4. И, наконец, когда вы получите enum MySqlDbType, вы можете использовать его как SqlDbType.

            public static string UseSqlDbTypeEnum (SqlDbType e) 
            { 
                 return e.ToString(); 
            }
    
    
            var receivedEnumMember = MySqlDbType.BigInt;
            var sqlDbType = ConvertMySqlDbTypeToSqlDbType(receivedEnumMember);
            UseSqlDbTypeEnum(sqlDbType);
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...