Я думаю, правильный ответ должен быть 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.
При помощи ответа от TcKs это может также быть сделано со следующим запросом LINQ:
bool isBar = foo.GetType().GetInterfaces().Any(x =>
x.IsGenericType &&
x.GetGenericTypeDefinition() == typeof(IBar<>));
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;
}
}
Необходимо подняться через дерево наследования и найти все интерфейсы для каждого класса в дереве и соответствовать typeof(IBar<>)
результату вызова Type.GetGenericTypeDefinition
, если интерфейс универсален. Это все немного болезненно, конечно.
См. этот ответ и эти для большего количества информации и кода.
Необходимо проверить по созданному типу универсального интерфейса.
необходимо будет сделать что-то вроде этого:
foo is IBar<String>
, потому что IBar<String>
представляет тот созданный тип. Причина необходимо сделать это, состоит в том, потому что, если T
не определено в проверке, компилятор не знает, имеете ли Вы в виду IBar<Int32>
или IBar<SomethingElse>
.
В первую очередь 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();
В качестве расширения вспомогательного метода
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!