我有一个通用的方法
bool DoesEntityExist<T>(Guid guid, ITransaction transaction) where T : IGloballyIdentifiable;
Run Code Online (Sandbox Code Playgroud)
如何以下列方式使用该方法:
Type t = entity.GetType();
DoesEntityExist<t>(entityGuid, transaction);
Run Code Online (Sandbox Code Playgroud)
我一直收到愚蠢的编译错误:
找不到类型或命名空间名称't'(您是否缺少using指令或程序集引用?)
DoesEntityExist<MyType>(entityGuid, transaction);
Run Code Online (Sandbox Code Playgroud)
完美的工作,但我不想使用if指令每次调用具有单独类型名称的方法.
可以说我有以下课程
public class Animal { .... }
public class Duck : Animal { ... }
public class Cow : Animal { ... }
public class Creator
{
public List<T> CreateAnimals<T>(int numAnimals)
{
Type type = typeof(T);
List<T> returnList = new List<T>();
//Use reflection to populate list and return
}
}
Run Code Online (Sandbox Code Playgroud)
现在在一些代码中,我想读一下要创建的动物.
Creator creator = new Creator();
string animalType = //read from a file what animal (duck, cow) to create
Type type = Type.GetType(animalType);
List<animalType> animals = creator.CreateAnimals<type>(5);
Run Code Online (Sandbox Code Playgroud)
现在问题是最后一行无效.有没有一些优雅的方式来做到这一点?
我上课了
public class A<T>
{
public static string B(T obj)
{
return TransformThisObjectToAString(obj);
}
}
Run Code Online (Sandbox Code Playgroud)
上面使用字符串纯粹是示范性的.我可以在已知/指定的类型上调用这样的静态函数:
string s= A<KnownType>.B(objectOfKnownType);
Run Code Online (Sandbox Code Playgroud)
如果我事先不知道T,我该怎么做这个调用,而是我有一个Type类型的变量来保存类型.如果我这样做:
Type t= typeof(string);
string s= A<t>.B(someStringObject);
Run Code Online (Sandbox Code Playgroud)
我得到这个编译器错误:
Cannot implicitly convert type 't' to 'object'
Run Code Online (Sandbox Code Playgroud) 我有一个像这样的Generic类:
public class Repository<T> {...}
Run Code Online (Sandbox Code Playgroud)
我需要用字符串来实例...示例:
string _sample = "TypeRepository";
var _rep = new Repository<sample>();
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这甚至可能吗?
谢谢!
我正在使用ChannelFactory编写WCF,它需要一个类型来调用CreateChannel方法.例如:
IProxy proxy = ChannelFactory<IProxy>.CreateChannel(...);
Run Code Online (Sandbox Code Playgroud)
在我的情况下,我正在做路由,所以我不知道我的渠道工厂将使用什么类型.我可以解析一个消息头来确定类型,但我在那里碰到了一堵砖墙,因为即使我有一个Type I实例也无法传递ChannelFactory期望泛型类型的实例.
用非常简单的术语重述这个问题的另一种方法是我试图做这样的事情:
string listtype = Console.ReadLine(); // say "System.Int32"
Type t = Type.GetType( listtype);
List<t> myIntegers = new List<>(); // does not compile, expects a "type"
List<typeof(t)> myIntegers = new List<typeof(t)>(); // interesting - type must resolve at compile time?
Run Code Online (Sandbox Code Playgroud)
我可以在C#中使用这种方法吗?
我正在创建一个将小脚本变成dll的系统.当我尝试获取可为空的值类并将其设置为参数的默认值时,我遇到了问题.问题是我需要在编译器中创建一个用户选择为nullable的实例,并将其设置为常量.
不幸的是,每当我使用Activator.CreateInstance(NullableType)(其中NullableType是来自用户输入的创建类型)时,我得到null返回值.例如,只需执行:
object Test = Activator.CreateInstance(typeof(Nullable<int>));
Console.WriteLine(Test == null);
Run Code Online (Sandbox Code Playgroud)
返回true.这仅与Nullables发生.在C#中创建的结构,甚至是通用结构,都可以很好地创建.哎呀,如果我从DotNetReflector复制并粘贴nullable(并删除TypeDependencyAttribute,TargetPatchingOptOutAttribute和ThrowHelper调用,因为我没有访问权限),它会在上面显示False.
到底是怎么回事?当我在运行时之前不知道通用参数时,还有其他可能的方法来创建可空吗?
我想创建一个通用的List <>,其类型在运行时声明.
我可以做到以下几点,但由于它是动态的,我怀疑存在速度惩罚.我正在为异国情调的数据库编写一个包装器,因此速度至关重要.
List<dynamic> gdb = new List<dynamic>()
Run Code Online (Sandbox Code Playgroud)
我在动态泛型类型中阅读了这篇文章,但无法让它发挥作用.具体来说,该对象不会显示为List,因此没有添加方法.
Type ac;
switch (trail[dataPos].Type)
{
case GlobalsSubscriptTypes.Int32:
ac = typeof(System.Int32);
break;
case GlobalsSubscriptTypes.Int64:
ac = typeof(System.Int64);
break;
default:
ac = typeof(System.String);
break;
}
var genericListType = typeof(List<>);
var specificListType = genericListType.MakeGenericType(ac);
var gdb = Activator.CreateInstance(specificListType);
Run Code Online (Sandbox Code Playgroud)
如何让gdb显示为以下之一:
List<System.Int32>
List<System.Int64>
List<System.String>
Run Code Online (Sandbox Code Playgroud) 我有一个项目,它在SQL中存储值,然后检索它们进行分析.为了跟踪可能存储的值类型,我创建了一个大致如下的类:
private class DataField
{
public string FieldName;
public string FieldType;
}
Run Code Online (Sandbox Code Playgroud)
在读取值进行分析时,使用switch语句如下(简化):
switch (DataField.FieldType)
{
case "int":
List<int> InputData = new List<int>();
// Populate list from DB
break;
case "bool":
List<bool> InputData = new List<bool>();
// Populate list from DB
break;
}
Run Code Online (Sandbox Code Playgroud)
我没有在多个地方维护代码,而是在寻找摆脱switch语句的方法,但这意味着我需要根据类型动态创建集合.当前该类型是(天真地?)一个字符串,但我想我可以通过更改类来改进它:
private class ImprovedDataField
{
public string FieldName;
public Type FieldType;
}
Run Code Online (Sandbox Code Playgroud)
然后以某种方式动态创建集合:
Type DataType = typeof(DataField.FieldType);
List<DataType> InputData = new List<DataType>();
// Populate list from DB
Run Code Online (Sandbox Code Playgroud)
这当然不起作用,导致Type or namespace name expected错误.
不幸的是Type,当我寻找解决方案时,我不熟悉使用该类,也不熟悉泛型或匿名类型(似乎没有什么是合适的). …
下面就例如这个帖子,我发现了如何动态地创建通用类型的列表。现在,我的问题是我想将项目从未知来源列表添加到创建的列表中,有什么方法可以实现?
编辑 我从包含业务对象的源列表开始,但是由于需要下游绑定,因此我绝对需要正确的输出列表类型。
我的非编译代码如下:
IList<object> sourceList; // some list containing custom objects
Type t = typeof(IList).MakeGenericType(sourceList[0].GetType());
IList res = (IList)Activator.CreateInstance(t);
foreach (var item in sourceList) {
reportDS.Add(item); // obviously does not compile
}
Run Code Online (Sandbox Code Playgroud) 我在使用泛型创建类的新实例时遇到问题.我想要做的是拥有一个可以使用DBSet <>或FakeDBSet <>创建的数据库上下文.FakeDBSet将用于测试代码.我目前有一个完整的假数据文本,但它是一个浪费,因为唯一真正的区别是使用的DBSet.我已经研究过使用Activator.CreateInstance()而没有太多运气.
例:
public class Album {}
public class Artist {}
public class MusicStoreContext
{
public IDbSet<Album> Albums { get; set; }
public IDbSet<Artist> Artists { get; set; }
public MusicStoreContext(Type dbSetType)
{
Albums = new (dbSetType)<Album>;
Artists = new (dbSetType)<Artist>;
}
}
public class Startup
{
public Startup()
{
// Production code would do something like this:
MusicStoreContext context = new MusicStoreContext(typeof(DbSet<>));
// Test code would do something like this:
MusicStoreContext testContext = new MusicStoreContext(typeof(FakeDbSet<>));
}
}
Run Code Online (Sandbox Code Playgroud)
我也尝试过这样的事情: …
c# ×10
generics ×7
.net ×2
reflection ×2
types ×2
c#-4.0 ×1
datacontext ×1
dynamic ×1
generic-list ×1
list ×1
tdd ×1