我得到了Type,但这与我正在寻找的Class不同。
是否存在typeof的反向操作?
我需要这个类才能使用通用存储库:
GenericRepository<BaseEntity> repository = new GenericRepository<BaseEntity>(new AzureBrightData());
我从编写BaseEntity开始,所有实体类都从该BaseEntity下降,但问题是存储库需要知道要搜索哪个表。
例如,如果我们有(1,1)的分区键和行键组合对,则不允许我或存储库知道从哪个表获取注册表。这还不够,这就是为什么我相信我需要这张桌子。
答案 0 :(得分:7)
如果我理解你问题的答案,那么你可能正在寻找类似的东西(实例化类型):
Assembly asmApp = Assembly.LoadFile("some.dll"); Type tApp = asmApp.GetType("Namespace.SomeClass"); object oApp = Activator.CreateInstance(tApp, new object[0] { });
答案 1 :(得分:3)
使用“Activator”类:
Activator.CreateInstance<T>
答案 2 :(得分:2)
我认为您正在寻找Activator.CreateInstance。
答案 3 :(得分:2)
我的答案基于您在评论中提供的澄清:
我误解了每个人在这里所说的话,或者至少我没有说清楚。我想要上课,因为我会正常使用它。例如,我必须像这样传递类:
public void methodName<T>()
其中T
是类。
简短回答:不,你不能,因为泛型类型在编译时被解析。
答案很长:是的,你可以,但你需要使用反射。这是你如何做到的:
答案 4 :(得分:1)
使用new()约束。
public T Create<T>() where T : new() {
return new T();
}
答案 5 :(得分:1)
以下是按照我的偏好列出的一些选项。我假设T
是泛型类或方法中的类型参数。
new T(); // T must be constrained to support a default constructor.
或
Activator.CreateInstance(typeof(T), new object[] { });
或
typeof(T).GetConstructor(new Type[] { }).Invoke(null);
或
AppDomain.CurrentDomain.CreateInstanceAndUnwrap(typeof(T).Assembly.FullName, typeof(T).FullName);
答案 6 :(得分:1)
我一定错过了什么。到目前为止提供的答案似乎与问题不符。我希望更清晰。
尽管如此,我会尽力回答这个问题。
你说你正试图这样做:
var repository = new GenericRepository<BaseEntity>(new AzureBrightData());
你想尝试做更像这样的事吗?
var repository = new GenericRepository<AzureBrightData>();
如果是这样,那么您的通用存储库类需要定义如下:
public class GenericRepository<T> where T : BaseEntity, new()
{
...
}
然后你可以像以前那样定义你的BaseEntity
类,但是你的存储库的实例化将为你提供实际的类 - 我希望那个表 - 你正在寻找。
我希望我理解你的问题。
答案 7 :(得分:0)
我不完全理解 OP 问题,但我认为这肯定会帮助一些搜索 inverse of typeof
的人,这就是我自己来到这里的方式。
我在查找表中有一个动态组件列表。
class ImageComponent
{
media: 'IMAGE';
}
class VideoComponent
{
media: 'VIDEO';
}
// lookup table (runtime construct)
const components = {
'image': ImageComponent,
'video': VideoComponent
}
所以我想取 'image'
(表中的键)并最终得到 IMAGE
,它是 ImageComponent
的一个属性。
从表中查找组件:
type imageComponent = typeof components['image']; // typeof ImageComponent
如果我们确实有 ImageComponent
,那么我们可以对其进行类型查找。
ImageComponent['media'] // 'IMAGE'
但是我们有 typeof ImageComponent
而不是用于查找类的任何属性。
type mediaType = imageComponent['media']; // does not work
所以我们可以做的是从`typeof YourClassName 中获取'原型类型'。
type media = imageComponent['prototype']['media']; // 'IMAGE' (const value)
或者换句话说,我们实际上在做的是:
type media = (typeof ImageComponent)['prototype']['media'];
所以对我来说,这满足了我对“inverse of typeof”的搜索。
另请注意,'IMAGE'
和 'VIDEO'
是 literal types 而不是字符串(除非在运行时它们只是字符串)。