Сейчас есть некоторое свойство
public object this[ string name ]
{
get
{
...
return res;
}
}
в зависимости от name оно может вернуть разные типы ( int, string, datetime, и т.п. )
хотелось бы более жестко типизировать результат.
что-то типа
public int this[ string name ]
..
public string this[ string name ]
И еще вопрос — как лучше сделать приведение в таком методе :
public Set( string name, object val )
{
switch( val.GetType().ToString() )
{
case "System.Int32": someprop[ name ] = ( int ) val;
case "System.String": someprop[ name ] = ( string ) val;
...
И т.п.
}
}
Здравствуйте, Аноним, Вы писали:
А>Сейчас есть некоторое свойство
А>в зависимости от name оно может вернуть разные типы ( int, string, datetime, и т.п. )
А>хотелось бы более жестко типизировать результат.
А>что-то типа
А>А>public int this[ string name ]
А>..
А>public string this[ string name ]
А>
Это слишком жестко. Компилятор не дорос до такой жести, в одном классе объявить такое не позволит.
А>И еще вопрос — как лучше сделать приведение в таком методе :
А>
А> switch( val.GetType().ToString() )
А> {
А> case "System.Int32": someprop[ name ] = ( int ) val;
А> case "System.String": someprop[ name ] = ( string ) val;
А> ...
А> И т.п.
А> }
А>
Пока sompeprop[name] имеет тип object, смысла приводить val к какому-либо типу нет, потому как при присвоении он опять преобразуется к object. Т.е. лучше приведение в таком методе убрать.
Здравствуйте, Аноним, Вы писали:
А>Сейчас есть некоторое свойство
А>public object this[ string name ]
А>в зависимости от name оно может вернуть разные типы ( int, string, datetime, и т.п. )
А>хотелось бы более жестко типизировать результат.
А для чего? Можете показать сценарий работы, использования такого свойства?
Здравствуйте, Аноним, Вы писали:
А>И еще вопрос — как лучше сделать приведение в таком методе :
А>
А> public Set( string name, object val )
А> {
А> switch( val.GetType().ToString() )
А> {
А> case "System.Int32": someprop[ name ] = ( int ) val;
А> case "System.String": someprop[ name ] = ( string ) val;
А> ...
А> И т.п.
А> }
А> }
А>
Минуточку, а is уже отменили?
Здравствуйте, Аноним, Вы писали:
А>в зависимости от name оно может вернуть разные типы ( int, string, datetime, и т.п. )
А>хотелось бы более жестко типизировать результат.
С именованными индексаторами в шарпе плохо.

Как вариант:
public abstract class Indexer<T>
{
private IDictionary<String, Object> _items;
protected Indexer(IDictionary<String, Object> items)
{
_items = items;
}
protected abstract T Parse(Object value);
public T this[String name]
{
get
{
return Parse(_items[name]);
}
}
}
public class StringIndexer : Indexer<String>
{
public StringIndexer(IDictionary<String, Object> items)
: base(items)
{
}
protected override string Parse(Object value)
{
return value.ToString();
}
}
public class Int32Indexer : Indexer<Int32>
{
public Int32Indexer(IDictionary<String, Object> items)
: base(items)
{
}
protected override int Parse(object value)
{
return (Int32)value;
}
}
public class MyClass
{
private IDictionary<String, Object> _items;
public MyClass()
{
_items = new Dictionary<String, Object>();
AsString = new StringIndexer(_items);
AsInt32 = new Int32Indexer(_items);
}
public void Add(String name, Object value)
{
_items.Add(name, value);
}
public StringIndexer AsString { get; private set; }
public Int32Indexer AsInt32 { get; private set; }
}
class Program
{
static void Main(string[] args)
{
var myClass = new MyClass();
myClass.Add("Id", 1);
myClass.Add("Name", "John");
Console.WriteLine(myClass.AsInt32["Id"]);
Console.WriteLine(myClass.AsString["Name"]);
}
}