我有一个 ASP.NET Core 项目 (netcoreapp2.0),它引用类库项目 (netstandard2.0) 中的模型。我正在尝试使用 Mapster 来映射存储在类库中的对象。Mapster 的文档说使用以下代码从 Startup.cs 调用 Scan 方法:
TypeAdapterConfig.GlobalSettings.Scan(assembly1, assembly2, assemblyN)
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是如何最好地获取类库的程序集引用以传递给 Scan 方法。我认为这更像是一个一般的 .NET 问题,而不是特定于 Mapster 的问题。我能想到的最好的是以下内容,但感觉很尴尬。
private Assembly GetAssemblyByName(string name)
{
var assemblies = Assembly.GetEntryAssembly().GetReferencedAssemblies();
var assemblyName = assemblies.FirstOrDefault(i => i.Name == name);
var assembly = Assembly.Load(assemblyName);
return assembly;
}
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来处理这个问题?
更新:显然我上面的解决方案破坏了代码优先迁移。任何人都可以建议一种方法来实现这一目标吗?
我有一堂课,如下所述:
public class Employee {
[JsonProperty("emp_id")]
public int Id {get; set;}
[JsonProperty("emp_fname")]
public string Name {get;set;}
[JsonProperty("emp_lname")]
public string LastName {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
在上面的类中,我为序列化分配了 Newtonsoft 属性。
我有一个类对象Employee,现在我想找到该属性JsonProperty并获取该属性的值。
例如,我想获取 JsonProprty 属性名称设置为的属性的值emp_lname
有没有办法使用反射来找到这样的价值?
我想使用Roslyn对以下类执行反射样式操作:
public abstract class MyBaseClass
{
public bool Method1()
{
return true;
}
public bool Method2()
{
return true;
}
public void Method3()
{
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我想这样做,但与罗斯林:
BindingFlags flags = BindingFlags.Public |
BindingFlags.Instance;
MethodInfo[] mBaseClassMethods = typeof(MyBaseClass).GetMethods(flags);
foreach (MethodInfo mi in mBaseClassMethods)
{
if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(void))
{
methodInfos.Add(mi);
}
if (mi.GetParameters().Length == 0 && mi.ReturnType == typeof(bool))
{
methodInfos.Add(mi);
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,我想获得符合我在上面的反射示例中使用的标准的方法列表.此外,如果有人知道一个网站,解释如何做反射像操作与罗斯林,请随时指出我的方向.我一直在寻找几个小时,似乎无法在这方面取得进展.
提前致谢,
短发
我有问题.这是我的代码:
var method = new DynamicMethod("dummy", null, Type.EmptyTypes);
var g = method.GetILGenerator();
g.DeclareLocal(typeof(int));
Label inequality = g.DefineLabel();
Label equality = g.DefineLabel();
Label end = g.DefineLabel();
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Ldstr, "string");
g.Emit(OpCodes.Call, typeof(String).GetMethod("op_Equality", new Type[]{typeof(string), typeof(string)}));
g.Emit(OpCodes.Stloc_0);
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(int)}));
g.Emit(OpCodes.Ldloc_0);
g.Emit(OpCodes.Ldc_I4_1);
g.Emit(OpCodes.Ceq);
g.Emit(OpCodes.Brtrue_S, equality);
g.Emit(OpCodes.Brfalse_S, inequality);
g.MarkLabel(inequality);
g.Emit(OpCodes.Ldstr, "Specified strings are different.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[]{typeof(string)}));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(equality);
g.Emit(OpCodes.Ldstr, "Specified strings are same.");
g.Emit(OpCodes.Call, typeof(Console).GetMethod("WriteLine", new Type[] { typeof(string) }));
g.Emit(OpCodes.Br_S, end);
g.MarkLabel(end);
g.Emit(OpCodes.Ret);
var action = (Action)method.CreateDelegate(typeof(Action)); …Run Code Online (Sandbox Code Playgroud) c# reflection if-statement reflection.emit system.reflection
TypeInfo默认情况下,新类在"DeclaredXXX"属性中是否包含私有成员?
我上了课
public class News : Record
{
public News()
{
}
public LocaleValues Name { get; set; }
public LocaleValues Body;
}
Run Code Online (Sandbox Code Playgroud)
在我的LocaleValues班上,我有:
public class LocaleValues : List<LocalizedText>
{
public string Method
{
get
{
var res = System.Reflection.MethodBase.GetCurrentMethod().Name;
return res;
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我像这样调用时,我需要Method属性返回Name属性名称的字符串表示形式:
var propName = new News().Name.Method;
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?感谢您的时间!
我有三节课:
public class TestA
{
public string Str1 { get; set; }
public string Str2 { get; set; }
public TestB TestB { get; set; }
public TestA()
{
Str1 = "string1";
Str2 = "string2";
TestB = new TestB();
}
}
public class TestB
{
public string Str3 { get; set; }
public string Str4 { get; set; }
public TestC ObjTestC { get; set; }
public TestB()
{
Str3 = "string3";
Str4 = "string4";
ObjTestC = new TestC();
} …Run Code Online (Sandbox Code Playgroud) 我有以下场景,我想获得实现接口的类的属性,但不包括那些虚拟的属性.为了说清楚,我将给你一个小例子: -
想象一下,我们有以下界面: -
public interface IUser
{
int UserID { get; set; }
string FirstName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
实现此接口的类: -
public class User: IUser
{
public int UserID { get; set; }
public string FirstName { get; set; }
public virtual int GUID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在,我想要做的是获取除了虚拟的类的属性.当类没有实现接口时,以下工作正常: -
var entityProperties = typeof(User).GetProperties()
.Where(p => p.GetMethod.IsVirtual == false);
Run Code Online (Sandbox Code Playgroud)
但是,当实现接口时,上面的代码行不会返回任何结果.如果我删除'where'它工作正常(但虚拟属性不会被排除),如下所示:
var entityProperties = typeof(User).GetProperties();
Run Code Online (Sandbox Code Playgroud)
有人有任何想法吗?我搜索但是我无法找到任何结果.在此先感谢您的帮助.
我试图FontWeights使用反射在C#中获取类的属性.
var properties = typeof(FontWeights).GetProperties();
var dialog = new MessageDialog("Number of weights: " + properties.Length);
await dialog.ShowAsync();
Run Code Online (Sandbox Code Playgroud)
使用Debug配置构建时,上面的工作正常.但是,使用Release时,找不到任何属性.
为什么会这样?有办法解决吗?
这是一个UWP应用程序.
我想使用C#的反射和自定义属性来简化使用中央管理类注册一系列类型(即它提供了采用字符串键并调用/检索相关类型的正确方法/参数的静态方法).看看这里的其他问题和其他地方的几个地方,似乎最好的方法是简单地遍历所有公共类型的程序集 - 因为它打算成为一个库 - 并检查每种类型是否具有正确的在将相关值添加到基础词典之前的属性.反射和迭代肯定会很慢,但我可以忍受它,因为它应该只发生一次.
不幸的是,我无法弄清楚如何从类型中获取属性.对于方法和程序集,我可以使用CustomAttributeExtensions.GetCustomAttribute<MyAttribute>(base)from System.Reflection.Extensions,但是不提供重载Type; 与此问题中使用的相同Assembly.GetCustomAttribute(Assembly, Type)和.IsDefined(...)方法相同.其他建议使用自己的方法,从文档中看起来似乎是从中加载的,但是即使在添加引用之后它似乎也没有出现在Intellisense中,我不确定.dll是如何与.NET交互的标准,无论如何(因为它会降低在任意平台上运行的能力吗?) Typemscorelib.dll
我错过了一些明显的东西,还是真的难以Attribute退出Type?
c# ×9
reflection ×5
.net ×4
.net-core ×1
asp.net-core ×1
if-statement ×1
json.net ×1
mapster ×1
roslyn ×1