Как определить, реализует ли тип определенный универсальный интерфейсный тип

Я думаю, правильный ответ должен быть java.sql.Timestamp не является специфичным для часового пояса. Временная метка представляет собой составную часть java.util.Date и отдельную наносекунду. В этом классе нет информации о часовом поясе. Таким образом, так же, как Date, этот класс просто содержит миллисекунды с 1 января 1970 года, 00:00:00 GMT + nanos.

В PreparedStatement.setTimestamp (int parameterIndex, Timestamp x, Calendar cal) Календарь используется драйвером для изменения часовой пояс по умолчанию. Но Timestamp по-прежнему занимает миллисекунды в GMT.

API неясно, как именно JDBC-драйвер должен использовать Calendar. Провайдеры, похоже, не знают, как их интерпретировать, например. последний раз, когда я работал с MySQL 5.5 Calendar, драйвер просто игнорировал Calendar как в PreparedStatement.setTimestamp, так и в ResultSet.getTimestamp.

208
задан sduplooy 2 February 2009 в 15:36
поделиться

6 ответов

При помощи ответа от TcKs это может также быть сделано со следующим запросом LINQ:

bool isBar = foo.GetType().GetInterfaces().Any(x =>
  x.IsGenericType &&
  x.GetGenericTypeDefinition() == typeof(IBar<>));
365
ответ дан sduplooy 4 November 2019 в 14:15
поделиться
public interface IFoo<T> : IBar<T> {}
public class Foo : IFoo<Foo> {}

var implementedInterfaces = typeof( Foo ).GetInterfaces();
foreach( var interfaceType in implementedInterfaces ) {
    if ( false == interfaceType.IsGeneric ) { continue; }
    var genericType = interfaceType.GetGenericTypeDefinition();
    if ( genericType == typeof( IFoo<> ) ) {
        // do something !
        break;
    }
}
23
ответ дан TcKs 4 November 2019 в 14:15
поделиться

Необходимо подняться через дерево наследования и найти все интерфейсы для каждого класса в дереве и соответствовать typeof(IBar<>) результату вызова Type.GetGenericTypeDefinition , если интерфейс универсален. Это все немного болезненно, конечно.

См. этот ответ и эти для большего количества информации и кода.

32
ответ дан Community 4 November 2019 в 14:15
поделиться

Необходимо проверить по созданному типу универсального интерфейса.

необходимо будет сделать что-то вроде этого:

foo is IBar<String>

, потому что IBar<String> представляет тот созданный тип. Причина необходимо сделать это, состоит в том, потому что, если T не определено в проверке, компилятор не знает, имеете ли Вы в виду IBar<Int32> или IBar<SomethingElse>.

4
ответ дан Andrew Hare 4 November 2019 в 14:15
поделиться

В первую очередь public class Foo : IFoo<T> {} не компилирует, потому что необходимо указать класс вместо T, но предположение, что Вы делаете что-то как public class Foo : IFoo<SomeClass> {}

затем, если Вы делаете

Foo f = new Foo();
IBar<SomeClass> b = f as IBar<SomeClass>;

if(b != null)  //derives from IBar<>
    Blabla();
3
ответ дан Pablo Retyk 4 November 2019 в 14:15
поделиться

В качестве расширения вспомогательного метода

public static bool Implements<I>(this Type type, I @interface) where I : class
{
    if(((@interface as Type)==null) || !(@interface as Type).IsInterface)
        throw new ArgumentException("Only interfaces can be 'implemented'.");

    return (@interface as Type).IsAssignableFrom(type);
}

Пример использования:

var testObject = new Dictionary<int, object>();
result = testObject.GetType().Implements(typeof(IDictionary<int, object>)); // true!
9
ответ дан 23 November 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: