target is ICollection.[_];
От: Visor2004  
Дата: 27.04.12 14:50
Оценка:
subj конструкция не пашет... все время возвращается false, хотя target — это ICollection[T]. Это так должно быть?
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re: target is ICollection.[_];
От: hardcase Пират http://nemerle.org
Дата: 27.04.12 14:57
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>subj конструкция не пашет... все время возвращается false, хотя target — это ICollection[T]. Это так должно быть?


Так оно пашет по видимому изза того, что ICollection[_] превращается в ICollection[object].
/* иЗвиНите зА неРовнЫй поЧерК */
Re: target is ICollection.[_];
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.04.12 15:27
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>subj конструкция не пашет... все время возвращается false, хотя target — это ICollection[T]. Это так должно быть?


Если мне не изменяет память в дотнете нельзя сделать обобщенную проверку типов. Пиши ICollection[T] или ICollection[int], тогда будет работать.

Вот в макросах так можно проверять.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: target is ICollection.[_];
От: nikov США http://www.linkedin.com/in/nikov
Дата: 27.04.12 17:58
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>subj конструкция не пашет... все время возвращается false, хотя target — это ICollection[T]. Это так должно быть?


Ну так экзистенциальных типов Nemerle нет. _ просто означает, что тип должен быть выведен при компиляции.
Re[2]: target is ICollection.[_];
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.04.12 18:17
Оценка:
Здравствуйте, nikov, Вы писали:

N>Ну так экзистенциальных типов Nemerle нет. _ просто означает, что тип должен быть выведен при компиляции.


Ну, потенциально то проверку можно было бы сделать. На рефлексии вдеь это реализуемо. Вот только медленно будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: target is ICollection.[_];
От: Visor2004  
Дата: 28.04.12 19:39
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>subj конструкция не пашет... все время возвращается false, хотя target — это ICollection[T]. Это так должно быть?


Т.е. проверить является ли тип коллекцией я могу только так?

type.GetInterface("ICollection`1") != null
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[2]: target is ICollection.[_];
От: catbert  
Дата: 28.04.12 20:26
Оценка: :)
Здравствуйте, Visor2004, Вы писали:

V>Т.е. проверить является ли тип коллекцией я могу только так?


Я бы политкорректно выразился "так же, как в С#".
Re[2]: target is ICollection.[_];
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.04.12 20:49
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Т.е. проверить является ли тип коллекцией я могу только так?


V>
V>type.GetInterface("ICollection`1") != null
V>


Нужна динамическая проверка типов, или хватит статической (во время компиляции)?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: target is ICollection.[_];
От: BogdanMart Украина  
Дата: 28.04.12 22:16
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>
V>type.GetInterface("ICollection`1") != null
V>


А чем не устраивает проверка на is ICollection?

Ведь ICollection[T] наследует от ICollection
Re[3]: target is ICollection.[_];
От: catbert  
Дата: 29.04.12 09:07
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Ведь ICollection[T] наследует от ICollection


В этом случае да, но вообще говоря не всегда есть общий не-генерик тип. Допустим, IDictionary[T] не наследует от IDictionary.
Re[3]: target is ICollection.[_];
От: Visor2004  
Дата: 30.04.12 08:02
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Ведь ICollection[T] наследует от ICollection


С каких пор? Вот что мне показывает рефлектор:

[TypeDependency("System.SZArrayHelper")]
public interface ICollection[T] : IEnumerable[T], IEnumerable
{
....
}
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[3]: target is ICollection.[_];
От: Visor2004  
Дата: 30.04.12 08:03
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Нужна динамическая проверка типов, или хватит статической (во время компиляции)?


надо динамически в рантайме.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[4]: target is ICollection.[_];
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.04.12 08:22
Оценка:
Здравствуйте, Visor2004, Вы писали:

VD>>Нужна динамическая проверка типов, или хватит статической (во время компиляции)?


V>надо динамически в рантайме.


Тогда только через рефлексию.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: target is ICollection.[_];
От: BogdanMart Украина  
Дата: 30.04.12 13:09
Оценка:
Здравствуйте, Visor2004, Вы писали:


V>С каких пор? Вот что мне показывает рефлектор:...


Да... за фейлил, признаю.
у меня в одной программке был IStorage<T> : IStorage {куча методов} ; IStorage { пустой}

То есть IStorage служил чисто как флаг, чтобы проверить тип (использовалось для фильтрации сообщений )
Но с чужими типами такого не сделаешь...


Напиши макрос.. должно быть не сложно

typecheck( o, ICollection[_])

а макросс развернуть в рефлексионную проверку

o.GetType().GetGenericType().equals(...)
а вот каст к такому типу вряд ли получиться сделать в .Net'e без серьезных хаков компилятора.
Re[5]: target is ICollection.[_];
От: Visor2004  
Дата: 30.04.12 21:24
Оценка:
Здравствуйте, BogdanMart, Вы писали:

BM>Напиши макрос.. должно быть не сложно

BM>typecheck( o, ICollection[_])
BM>а макросс развернуть в рефлексионную проверку

Меня тут волнует вопрос производительности, а не красоты Если альтернатив рефлексии нету, то меня и GetInterface устроит.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[6]: target is ICollection.[_];
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.04.12 21:44
Оценка:
Здравствуйте, Visor2004, Вы писали:

V>Меня тут волнует вопрос производительности, а не красоты :) Если альтернатив рефлексии нету, то меня и GetInterface устроит.


Вопрос производительности можно решить тупо мемоизируя проверки.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: target is ICollection.[_];
От: nikov США http://www.linkedin.com/in/nikov
Дата: 30.04.12 22:09
Оценка:
Здравствуйте, catbert, Вы писали:

C>Я бы политкорректно выразился "так же, как в С#".



using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        dynamic list = new List<int>();

        if(Implements.GenericICollection(list))
        {
            Console.WriteLine("ICollection<T>");
        }
    }
}

static class Implements
{
    public static bool GenericICollection<T>(ICollection<T> obj) { return true; }
    public static bool GenericICollection(object obj) { return false; }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.