Как сделать типизированное свойство ?
От: Аноним  
Дата: 05.08.10 02:49
Оценка:
Сейчас есть некоторое свойство

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;
                  ...
                  И т.п.
           }

 }
Re: Как сделать типизированное свойство ?
От: samius Япония http://sams-tricks.blogspot.com
Дата: 05.08.10 03:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сейчас есть некоторое свойство


А>в зависимости от 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. Т.е. лучше приведение в таком методе убрать.
Re: Как сделать типизированное свойство ?
От: _FRED_ Черногория
Дата: 05.08.10 06:22
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Сейчас есть некоторое свойство

А>public object this[ string name ]

А>в зависимости от name оно может вернуть разные типы ( int, string, datetime, и т.п. )
А>хотелось бы более жестко типизировать результат.

А для чего? Можете показать сценарий работы, использования такого свойства?
Help will always be given at Hogwarts to those who ask for it.
Re: Как сделать типизированное свойство ?
От: Абсолют Россия  
Дата: 05.08.10 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И еще вопрос — как лучше сделать приведение в таком методе :



А>

А> 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 уже отменили?
Re: Как сделать типизированное свойство ?
От: HowardLovekraft  
Дата: 05.08.10 07:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>в зависимости от 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"]);
        }
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.