假设以下类型定义:
public interface IFoo<T> : IBar<T> {}
public class Foo<T> : IFoo<T> {}
Run Code Online (Sandbox Code Playgroud)
当只有受损的类型可用时,如何确定类型是否Foo
实现了通用接口IBar<T>
?
假设我有一个看起来像这样的类:
class Derived : // some inheritance stuff here
{
}
Run Code Online (Sandbox Code Playgroud)
我想在我的代码中检查这样的内容:
Derived is SomeType;
Run Code Online (Sandbox Code Playgroud)
但看起来像is
运算符需要Derived是Dervied类型的变量,而不是Derived本身.我不想创建Derived类型的对象.
如何在SomeType
不实例化的情况下确保Derived继承?
PS如果它有帮助,我想要一些where
关键字与泛型有关的东西.
编辑:
类似于这个答案,但它正在检查一个对象.我想查看课程本身.
我首先使用Entity Framework 4.3.1代码进行显式迁移.如何在实体配置类或迁移中添加列的描述,以便最终作为SQL Server中列的描述(例如2008 R2)?
我知道我可以编写一个DbMigration
类的扩展方法,该方法将迁移事务中的sql迁移操作注册sp_updateextendedproperty
或sp_addextendedproperty
过程调用,并在迁移Up
方法中创建表后调用该扩展.但是,我还没有发现一种优雅的内置方式吗?拥有迁移的更改检测逻辑可以获取的属性并在scaffolded迁移中生成appropritate方法调用会很好.
我们可以在泛型类型参数上指定"派生自"约束,如下所示:
class Bar<T> where T : IFooGenerator
Run Code Online (Sandbox Code Playgroud)
有没有办法指定NOT派生自?
我的用例:我有一堆FooGenerator
可并行化的s,每个都有相同的并行化代码,但我们不希望它们总是被并行化.
public class FooGenerator : IFooGenerator
{
public Foo GenerateFoo() { ... }
}
Run Code Online (Sandbox Code Playgroud)
因此,我创建了一个用于并行生成Foo的通用容器类:
public class ParallelFooGenerator<T> : IFooGenerator where T : IFooGenerator
{
public Foo GenerateFoo()
{
//Call T.GenerateFoo() a bunch in parallel
}
}
Run Code Online (Sandbox Code Playgroud)
因为我想要FooGenerator
和ParallelFooGenerator<FooGenerator>
可以互换,我做ParallelFooGenerator : IFooGenerator
.但是,我显然不想ParallelFooGenerator<ParallelFooGenerator>
合法.
因此,作为一个辅助问题,如果"不是从"约束条件不可能的话,是否有更好的方法来设计它?
我有一个通用类型如下
public class TestGeneric<T>
{
public T Data { get; set; }
public TestGeneric(T data)
{
this.Data = data;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我现在有一个对象(来自某个外部源)我知道它的类型是一些封闭的TestGeneric <>,但我不知道TypeParameter T.现在我需要访问我的对象的数据.问题是我无法强制转换对象,因为我不确切知道哪个封闭的TestGeneric.
我用
// thx to http://stackoverflow.com/questions/457676/c-reflection-check-if-a-class-is-derived-from-a-generic-class
private static bool IsSubclassOfRawGeneric(Type rawGeneric, Type subclass)
{
while (subclass != typeof(object))
{
var cur = subclass.IsGenericType ? subclass.GetGenericTypeDefinition() : subclass;
if (rawGeneric == cur)
{
return true;
}
subclass = subclass.BaseType;
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
为了确保,我的对象是泛型类型.有问题的代码如下:
public static void Main()
{
object myObject = new TestGeneric<string>("test"); // or from another …
Run Code Online (Sandbox Code Playgroud) 所以,我得到了一些我需要序列化/反序列化的类,这些类也恰好是域对象(至少是一些'em),因此我希望它们没有任何属性或者不依赖于某个框架.
我在Json.NET中查看了Custom Converters,但是在使用方面它们看起来非常" 古老 ",而不是,因为我们现在有了泛型,并且实现流畅的界面并不难.所以在我走弱路线之前等等.
...我正在寻找什么(伪):
public class MyModel {
public int Id { get; set; }
public string Name { get; set; }
public SomeObj SomeObj { get; set; }
}
public class MyModelConverter : JsonConverter<MyModel> {
public JsonConverter() {
RuleFor(x => x.Id).Name("Identifier");
RuleFor(x => x.SomeObj).Name("Data")
.WithConverter(new SomeObjConverter());
RuleFor(x => x.Name).Ignore();
}
}
Run Code Online (Sandbox Code Playgroud)
在Json.NET中有类似的东西吗?我只是错过了一些东西吗?(顺便说一句,我不能为我的属性等使用不同的名称,因为模型基于第三方规范).
说我有以下课程:
public class General<T> { }
Run Code Online (Sandbox Code Playgroud)
我想知道一个对象是否属于那种类型.我知道我可以使用反射来找出该对象是否属于该泛型类型Type.GetGenericTypeDefinition
,但我想避免这种情况.
是否有可能做某事obj is General<T>
,或obj.GetType().IsAssignableFrom(typeof(General<T>))
?
我很惊讶我找不到类似的问题,尽管我在搜索中可能使用了错误的关键字.
我正在尝试使用反射编写一个方法来返回所有类,这些类是使用泛型的类的子类,而不受泛型类型的限制.例如,在EF中我想找到所有的映射类.这些类的设置如下:
public class clientMap : EntityTypeConfiguration<Client> {}
Run Code Online (Sandbox Code Playgroud)
我想在我的程序集中找到所有类的子类EntityTypeConfiguration<T>
,而没有特别指定Client
为T.我想在我的应用程序中为所有类返回实体类型配置,而不对其进行硬编码.
如果没有泛型,我会循环遍历程序集中的类型,检查是否type.IsSubclassOf(typeof(BaseClass))
,但是我不知道在处理泛型时如何执行此操作.
我正在尝试反序列化 json
{
"Type": "Correction",
"StartTime": "2007-12-19T03:00:00.0000000-08:00",
"EndTime": "2007-12-23T23:00:00.0000000-08:00",
"Parameters": [
{
"Key": "Something",
"Value": "1.8"
},
{
"Key": "Something2",
"Value": "0.10000000000000001"
},
{
"Key": "Something3",
"Value": "answer3"
},
],
}
Run Code Online (Sandbox Code Playgroud)
进入一个 Dto 包括public IReadOnlyDictionary<string, string> Parameters { get; set; }
许多其他的东西。
我正在使用最新的 newtonsoft 解串器,其功能是
var responseObject = JsonConvert.DeserializeObject<TResponse>(jsonResponse);
Run Code Online (Sandbox Code Playgroud)
但它返回错误
Newtonsoft.Json.JsonSerializationException : Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'System.Collections.Generic.IReadOnlyDictionary`2[System.String,System.String]' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
Run Code Online (Sandbox Code Playgroud)
是否有任何工具可以帮助我将 Json 响应更改为不同的响应,例如
"Parameters": …
Run Code Online (Sandbox Code Playgroud) 在C#中是否有任何方法可以指定只能从同一程序集的派生类internal
访问而不使用访问修饰符的方法?
谢谢.
c# ×10
.net ×4
generics ×4
reflection ×3
json ×2
types ×2
casting ×1
fluent ×1
inheritance ×1
json.net ×1