Как правильно конвертировать в List‹ExpandoObject›

Посмотрите на приведенный ниже код

private static List<ExpandoObject> GetDBDetails()
        {
            var directoryPath = Environment.CurrentDirectory.Replace("\\bin\\Debug", "\\DataSource");
            var filePath = Path.Combine(directoryPath, "DBDetail.xml");
            try
            {
                //Load xml
                XDocument xdoc = XDocument.Load(filePath);
                if (xdoc == null) return null;


                List<ExpandoObject> dbDetails = (from dbDetail in xdoc.Descendants("database")
                                       select new ExpandoObject
                                            {
                                                DBDetailId = Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value),
                                                DBServerId = Convert.ToInt32(dbDetail.Attribute("dbServerID").Value)
                                                                                                });
               return dbDetails;
            }
            catch (Exception ex)
            {
                McAfee.EnterpriseLibrary.Logging.LogUtil.LogEntry(ex, System.Diagnostics.TraceEventType.Critical);
                return null;
            }
        }

я получаю сообщение об ошибке

System.Dynamic.ExpandoObject не содержит определения для DBDetailId System.Dynamic.ExpandoObject не содержит определения для DBServerId

Как это исправить?


person priyanka.sarkar    schedule 08.05.2013    source источник
comment
Другая альтернатива stackoverflow.com/questions/13704752/   -  person I4V    schedule 08.05.2013
comment
Любая причина, по которой вы используете ExpandoObject и не создаете новый класс, такой как «DbDetails, for this specific purpose? The Intellisense won't work outside of this method and passing around dynamic», также не является хорошей идеей.   -  person Dominic Zukiewicz    schedule 08.05.2013
comment
Поскольку тип объекта мне неизвестен, и я не могу создавать конкретные классы, так как это ограничение (:   -  person priyanka.sarkar    schedule 08.05.2013


Ответы (1)


Вам нужно преобразовать ExpandoObject в dynamic:

 xdoc.Descendants("database")
            .Select(dbDetail =>
                        {
                            dynamic expandoObj = new ExpandoObject();
                            expandoObj.DBDetailId = Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value);
                            expandoObj.DBServerId = Convert.ToInt32(dbDetail.Attribute("dbServerID").Value);
                            return (ExpandoObject) expandoObj;
                        })
            .ToList();

Также вы можете преобразовать ExpandoObject в IDictionary<string, object>:

var x = new ExpandoObject() as IDictionary<string, object>;
x.Add("DBDetailId", Convert.ToInt32(dbDetail.Attribute("dbDetailId").Value));
x.Add("DBServerId", Convert.ToInt32(dbDetail.Attribute("dbServerID").Value));
person Vyacheslav Volkov    schedule 08.05.2013
comment
Но как вернуть List‹ExpandoObject›? Он появится как IEnumerable‹dynamic› - person priyanka.sarkar; 08.05.2013
comment
Примерно так: return (ExpandoObject) expandoObj;. Я обновил ответ. - person Vyacheslav Volkov; 08.05.2013