【发布时间】:2015-11-27 18:28:38
【问题描述】:
在我们的项目中,我们有多个所谓的Projections。这些Projection 类都有一个带有get 的字符串属性,称为ProjectionTypeName。这个ProjectionTypeName 对于所有投影应该是唯一的。
今天我遇到了两个投影具有相同ProjectionTypeName 的问题,这造成了很多麻烦。所以我决定做一个单元测试来防止这种情况再次发生。
我使用以下方法获取所有Projections中的所有Types:
// 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."。
所以,我的问题。当我只有类的 Type 可供处置(而不是实际的实例化对象)时,如何获取字符串属性 ProjectionTypeName 的值。
如果我有一个实例化的对象,我将能够做这样的事情:
myInstantiatedObject.GetType().GetProperty("ProjectionTypeName")
.GetValue(myInstantiatedObject, null);
【问题讨论】:
标签: c# reflection types properties typeof