在我们的项目中,我们有多个所谓的Projections
。这些Projection
-classes都有一个带有get的字符串属性,称为ProjectionTypeName
。这ProjectionTypeName
应该是唯一的所有投影。反射:通过类类型的Property-GetValue(因此没有实例化的对象)
今天我遇到了这样的问题,其中两个投影有相同的ProjectionTypeName
,这造成了很多麻烦。所以我决定做一个UnitTest来防止这种情况再次发生。
我用下面的方法来获取所有Types
所有Projections
:
// The excluded abstract projections
private static readonly List<Type> AbstractProjections = new List<Type>
{
typeof(AbstractRavenDbChangesProjection),
typeof(AbstractRavenDbTimelineProjection)
};
private static IEnumerable<Type> GetAllProjectionTypes()
{
return typeof(AbstractRavenDbChangesProjection)
.Assembly
.GetTypes()
.Where(x => typeof(AbstractRavenDbChangesProjection).IsAssignableFrom(x) && !x.IsInterface)
.Except(AbstractProjections)
.ToList();
}
然后我做了实际测试:
[Test]
public void TestNoDuplicated()
{
var noDuplicatedList = new Dictionary<Type, string>();
var projectionTypes = GetAllProjectionTypes();
foreach (var type in projectionTypes)
{
// TODO: Get projectionTypeName-value by Projection's Type
var projectionTypeName = ??;
Assert.IsFalse(noDuplicatedList.ContainsValue(projectionTypeName),
"{0} has been found as ProjectionTypeName in two different Projections: {1} & {2}",
projectionTypeName,
noDuplicatedList.First(x => x.Value == projectionTypeName).Key,
type);
noDuplicatedList.Add(type, projectionTypeName);
}
}
我四处张望了一下,甚至试图a piece of code by @JohnSkeet,即使他陈述(和我引述):
请不要这样做。永远。这很可怕。它应该被践踏, 切成小块,放在火上,然后再切断。有趣的是, 不是吗? ;)
但是它看起来像自2012年以来(当答案发布时)已被更改和.NET现在给你一个错误,当你尝试这种反射:"System.Security.VerificationException : Operation could destabilize the runtime."
。
所以,我的问题。如何获取字符串属性ProjectionTypeName
的值,当我只有该类的Type
供我处理(而不是实际的实例化对象)时。
如果我想有一个实例化对象我将能够做这样的事情:
myInstantiatedObject.GetType().GetProperty("ProjectionTypeName")
.GetValue(myInstantiatedObject, null);
为什么不使用Jons答案底部的简单代表解决方案? – usr
@usr因为我不能做他的第二个代码的这一部分:'Func
使用MakeGenericType创建委托类型并使用DynamicInvoke调用它。为您节省了晦涩难懂的IL一代。 – usr