当在编译时未知类型参数但是在运行时动态获取时,调用泛型方法的最佳方法是什么?
考虑以下示例代码 - 在Example()方法内部,GenericMethod<T>()使用Type存储在myType变量中调用的最简洁方法是什么?
public class Sample
{
public void Example(string typeName)
{
Type myType = FindType(typeName);
// What goes here to call GenericMethod<T>()?
GenericMethod<myType>(); // This doesn't work
// What changes to call StaticMethod<T>()?
Sample.StaticMethod<myType>(); // This also doesn't work
}
public void GenericMethod<T>()
{
// ...
}
public static void StaticMethod<T>()
{
//...
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个通用的方法
Foo<T>
Run Code Online (Sandbox Code Playgroud)
我有一个Type变量 bar
是否有可能实现类似的目标 Foo<bar>
Visual Studio期望在栏上有一个类型或命名空间.
善良,
担
我只需要使用System.Type从AutoFixture创建一个对象.但是,似乎没有过载CreateAnonymous(),只需要一种类型.他们都期望编译时通用T.有没有办法将System.Type转换为T?
编辑使用细节:
我正在使用AutoMapper,它有一个用于注入组件的钩子,以支持复杂的映射场景:
void ConstructServicesUsing(System.Func<Type,object> constructor)
Run Code Online (Sandbox Code Playgroud)
从签名中可以看出,客户端可以注册FuncAutoMapper何时需要注入服务(主要是ValueResolver实现).
在生成版本中,此方法调用我的StructureMap容器来检索组件.但是,在单元测试我的映射代码时,我必须提供存根实现,否则AutoMapper会抛出异常.由于我使用AutoFixture + Moq作为我的自动锁定容器,因此让AF新建一个完全水合的存根似乎很自然,所以我可以集中精力编写单元测试代码.
我有一个相当简单的问题,但在C#中似乎没有解决方案.
我有大约100个Foo类,每个类都实现一个static FromBytes()方法.还有一些泛型类应该使用这些方法FromBytes().但是泛型类不能使用这些static FromBytes()方法,因为它们T.FromBytes(...)是非法的.
我是否遗漏了某些内容或者无法实现此功能?
public class Foo1
{
public static Foo1 FromBytes(byte[] bytes, ref int index)
{
// build Foo1 instance
return new Foo1()
{
Property1 = bytes[index++],
Property2 = bytes[index++],
// [...]
Property10 = bytes[index++]
};
}
public int Property1 { get; set; }
public int Property2 { get; set; }
// [...]
public int Property10 { get; set; }
}
//public class Foo2 { ... }
// …Run Code Online (Sandbox Code Playgroud) 我需要使用如下方法:
DoSomething<(T)>();
Run Code Online (Sandbox Code Playgroud)
但我不知道我有哪种类型,只有类型的对象.如果我只有以下情况,我该如何调用此方法:
Type typeOfGeneric;
Run Code Online (Sandbox Code Playgroud) 我有一大堆自动生成的对象.尽管它们都是不同的非相关类,但所有对象都共享一些基本属性(名称,ID等).我不控制这些对象的生成,所以不幸的是我无法采用实现接口的理想方法.我想创建一个方法,在其中我传递这些对象中的任意一个并使用这些公共属性执行某些操作.
一般的想法是这样的:
someObj a = new someObj();
a.name = "sara";
diffObj b = new diffObj();
b.name = "joe";
string phrase = string.Format("I am with {0} and {1}",
getName(a), getName(b));
private string getName(object anyObjWithName)
{
return anyObjWithName.name;
}
Run Code Online (Sandbox Code Playgroud)
虽然自然这不起作用.
我认为泛型方法可能会有答案,但我能看到用当前类型调用它的唯一方法是使用genericMethod.Invoke,这仍然带有同样的问题,即无法解析方法中传递的对象的属性.这与Calling泛型方法不同,它只有在执行时才知道的类型参数或如何用给定的Type对象调用泛型方法?其中只有类型的类型或属性在方法中使用,而不是对象的属性.
我知道这会(非常)容易出错,但我可以保证遇到的所有对象都会被操纵共同的属性.