2012-01-26 4 views
2

У меня 6 XDocuments:.NET 4.0/C# - Создание объектов на лету

 XDocument parametersXDoc = new XDocument(new XElement(file.Root.Element("ArrayOfParameter"))); 
     XDocument criteriaXDoc = new XDocument(new XElement(file.Root.Element("ArrayOfCriteria"))); 
     XDocument sortfieldsXDoc = new XDocument(new XElement(file.Root.Element("ArrayOfSortField"))); 
     XDocument selectedfieldsXDoc = new XDocument(new XElement(file.Root.Element("ArrayOfSelectedField"))); 
     XDocument reportlayoutXDoc = new XDocument(new XElement(file.Root.Element("ReportLayout"))); 
     XDocument dictionaryXDoc = new XDocument(new XElement(file.Root.Element("Dictionary"))); 

Я хочу, чтобы передать их все к методу в качестве аргумента. Я мог бы передать их как массив, но тогда мне нужно будет знать позицию/индекс требуемого XDocument - это кажется беспорядочным.

Возможно ли создать временный объект-оболочку «на лету» (со свойствами), который указывает на каждую переменную XDocument и передать это вместо этого?

+1

как насчет 'Словарь <строка, XDocument>'? Ключ может быть именем вашего документа. – Reniuz

+0

Да, вы можете использовать ключевое слово 'dynamic'. См. Ответ ниже. С уважением, –

ответ

3

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

Что плохого в том, чтобы просто обернуть всю партию в классе?

public class Documents 
{ 
    public XDocument ParametersXDoc { get; set; } 
    public XDocument CriteriaXDoc { get; set; } 
    public XDocument SortfieldsXDoc { get; set; } 
    public XDocument SelectedfieldsXDoc { get; set; } 
    public XDocument ReportlayoutXDoc { get; set; } 
    public XDocument DictionaryXDoc { get; set; } 
} 

Этот класс, вероятно, меньше времени, чтобы написать, чем ваш StackOverflow вопрос;)

+0

+1 ha! хорошо сказано. –

+0

+1 хорошо сказал, я пытался придумать решение для динамического количества документов, но это не в вопросе – Paul

+0

Вы правы. Это возможно. Однако цель моего вопроса состояла в том, чтобы выяснить ответ ... – user559142

0

Если вы не хотите, чтобы пройти строго типизированный объект, то ваши быстрые и грязные варианты:

  1. Передайте анонимный объект:

new { Doc1=parametersXDoc , Doc2=criteriaXDoc , ... .... ..}

  1. Прохождение кортежа:

new Tuple<XDocument,XDocument,XDocument,XDocument,XDocument,XDocument>

  1. Проходят Dictionary<String,XDocument>
+0

С анонимным типом, Как будет выглядеть подпись метода по другому методу? Вам нужно будет использовать динамический. – MattDavey

+0

да, вам придется принять динамику. –

1

я должен использовать словарь вместо массива в этом случае будет использовать ключи для идентификации каждого из них.

var parameters = new Dictionary<String, XDocument>(); 
parameters["parametersXDoc"] = new XDocument(new XElement(file.Root.Element("ArrayOfParameter"))); 
parameters["criteriaXDoc"] = new XDocument(new XElement(file.Root.Element("ArrayOfCriteria"))); 
parameters["sortfieldsXDoc"] = new XDocument(new XElement(file.Root.Element("ArrayOfSortField"))); 
parameters["selectedfieldsXDoc"] = new XDocument(new XElement(file.Root.Element("ArrayOfSelectedField"))); 
parameters["reportlayoutXDoc"] = new XDocument(new XElement(file.Root.Element("ReportLayout"))); 
parameters["dictionaryXDoc"] = new XDocument(new XElement(file.Root.Element("Dictionary"))); 
+0

'params' является зарезервированным словом в C# – MattDavey

+0

oopps извините, я изменил его благодаря матушка – jerjer

+0

Я думал, что у них разные типы, спасибо – jerjer

1

Вы можете создавать и управлять динамическими объектами на лету, используя ключевое слово или dynamicExpandoObject в .NET4.0. Динамическое ключевое слово чрезвычайно мощное.

Пример использования метода OpenSource в том, как его можно успешно использовать на уровне доступа к данным, можно найти в PetaPoco micro-ORM.

От MSDN:

Visual C# 2010 вводит новый тип, динамический. Тип - это статический тип, но объект типа dynamic обходит проверку статического типа. В большинстве случаев он функционирует так, как будто он имеет объект типа.Во время компиляции, элемент, который набирается в динамике предполагается поддержка любой операции примера

ExpandoObject код

using System; 
using System.Dynamic; 
using System.Xml.Linq; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Creation and population of the ExpandoObject  
      // Add as many or few properties as you like. 
      // Property Types are set at runtime and for the lifetime of the 
      // property 
      // Expando objects also support dynamic methods. 
      dynamic wrapper = new ExpandoObject(); 
      wrapper.FirstProperty = "Hello"; 
      wrapper.SecondProperty = "Dynamic"; 
      wrapper.AnotherProperty = "World!"; 
      wrapper.AnyTypeProperty = 1234; 
      wrapper.XDocumentProperty = new XDocument(); 
      // etc 

      // Passing of ExpandoObject 
      PassWrapperToFunction(wrapper); 
      Console.ReadLine(); 
     } 

     // .. 
     // Function signature of recipient 
     private static void PassWrapperToFunction(dynamic wrapper) 
     { 
      Console.WriteLine("{0} {1} {2} {3}\n", 
       wrapper.FirstProperty, 
       wrapper.SecondProperty, 
       wrapper.AnotherProperty, 
       wrapper.AnyTypeProperty); 

      Console.WriteLine("Parameter types:\n{0}\n{1}\n{2}\n{3}\n{4}", 
       wrapper.FirstProperty.GetType(), 
       wrapper.SecondProperty.GetType(), 
       wrapper.AnotherProperty.GetType(), 
       wrapper.AnyTypeProperty.GetType(), 
       wrapper.XDocumentProperty.GetType()); 
     } 
    } 
} 

Выход

enter image description here

0

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

http://msdn.microsoft.com/en-us/library/bb397696.aspx

, хотя, как я сказал:

Чтобы передать анонимный тип или коллекцию, содержащую анонимные типов, как аргумент метода, вы можете объявить параметр как объект типа . Тем не менее, это наносит ущерб сильной типизации. Если вы должны сохранить результаты запроса или передать их за пределами границы метода , рассмотрите возможность использования обычной именной структуры или класса вместо анонимного типа.

0

Почему бы не использовать словарь - тогда вы можете использовать простой строковый ключ или, возможно, использовать уникальное свойство из документов в качестве ключа. Так, например:

public void FooMethod(Dictionary<String, XDocument> docDictionary) 
{ 
    var doc1 = docDictionary["parametersXDoc"]; 
    var doc2 = docDictionary["criteriaXDoc"]; 
    blah blah blah 
} 

Cheers, Крис.

Смежные вопросы