2013-06-22 2 views
3

У меня есть dbf-файл (dBase), который хочет прочитать, поместить каждую строку в один список (поскольку строка представляет данные об одном объекте шейп-файла), а затем иметь возможность modyfy (например, convert поля, которые представляют имя для строки). Это означает, что тип данных должен иметь возможность удерживать как Ints, string, bool и так далее, так и добавлять элементы к нему. В python я мог бы делать это со списками, но поскольку настройки can not могут быть изменены, я не могу их использовать.C# альтернатива кортежу

Это звучит как (точный) дубликат, например. Alternative to Tuples но нет. Эти вопросы основаны на предположении, что вы знаете, какие объекты вы хотите заранее. Я не.

Я нахожусь .net 4.5 btw.

+0

Можете ли вы предоставить некоторые примеры кода? – simonlchilds

ответ

2

Использование dynamic - это идеальный вариант использования для этого:

Visual C# 2010 вводит новый тип, динамический. Тип - это статический тип, но объект типа dynamic обходит проверку статического типа. В большинстве случаев он функционирует так, как будто он имеет объект типа. Во время компиляции предполагается, что элемент, который вводится как динамический, поддерживает любую операцию. Поэтому вам не нужно беспокоиться о том, получает ли объект его значение из COM API, с динамического языка, такого как IronPython, из объектной модели HTML Document Document (DOM), из отражения или из другого места в программе. Однако, если код недействителен, ошибки попадают во время выполнения.

+1

Не быть слишком придирчивым, но это особенность C# 4.0, а не Visual C# 2010; Visual C# 2010 - это продукт, а C# 4.0 - это язык. Вы можете использовать C# 4.0 как на VS 2010, так и на VS 2012. Просто хотелось убедиться, что это было ясно. :-) –

+0

@Karl - Вы должны быть придирчивы к MSDN, где находится цитата;) – Oded

+0

Перейти Microsoft! FTW! – jpaugh

1

Если вы хотите, чтобы иметь возможность легко добавлять свойства во время выполнения и изменять их типы, вы можете использовать ExpandoObject с dynamic, например:

dynamic expando = new ExpandoObject(); 

expando.SomeProperty = "1234"; 

Console.WriteLine(expando.SomeProperty); 
Console.WriteLine(expando.SomeProperty.GetType().FullName); // string 

expando.SomeProperty = int.Parse(expando.SomeProperty); 

Console.WriteLine(expando.SomeProperty); 
Console.WriteLine(expando.SomeProperty.GetType().FullName); // int