我想编写将 Sql Server 过程结果作为DataTable对象返回的通用代码。DataTable.Rows.Add()然后我编写了下面的代码,但是,我偶然发现了期望参数的问题params object[],而我必须传递的是IEnumerable<string>.
public static DataTable GetProcedureResults(int id)
{
return GetQueryResultAsDataTable<MyProcedure_Result>(_sqlServerDB.MyProcedure(id));
}
private static DataTable GetQueryResultAsDataTable<T>(ObjectResult<T> objectResult)
{
DataTable resultAsDataTable = new DataTable("Result");
var columns = typeof(T).GetProperties();
foreach (var column in columns)
{
resultAsDataTable.Columns.Add(column.Name, typeof(string));
}
foreach (var resultRecord in objectResult)
{
var fields = resultRecord.GetType().GetProperties().Select(p => p.GetValue(resultRecord).ToString());
resultAsDataTable.Rows.Add(fields);
}
return resultAsDataTable;
}
Run Code Online (Sandbox Code Playgroud)
对于熟悉这个问题的人来说,你可能已经猜到我最后的数据表是这样的:
这些值都被视为单个对象,因此都被插入到第一列中。
如果有的话,这里的解决方法是什么?我在其他帖子中读到,似乎 C#6 会解决这个问题,除此之外没有找到清晰简洁的解决方案。
我想要一种方法来检查类型是否是 C# 编译器自动生成的类型(例如 Lambda 闭包、操作、嵌套方法、匿名类型等)。
目前有以下几点:
public bool IsCompilerGenerated(Type type)
{
return type.Name.StartsWith("<>", StringComparison.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
附带测试:
public class UnitTest1
{
class SomeInnerClass
{
}
[Fact]
public void Test()
{
// Arrange - Create Compiler Generated Nested Type
var test = "test";
void Act() => _testOutputHelper.WriteLine("Inside Action: " + test);
// Arrange - Prevent Compiler Optimizations
test = "";
Act();
var compilerGeneratedTypes = GetType().Assembly
.GetTypes()
.Where(x => x.Name.Contains("Display")) // Name of compiler generated class == "<>c__DisplayClass5_0"
.ToList();
Assert.False(IsCompilerGenerated(typeof(SomeInnerClass)));
Assert.NotEmpty(compilerGeneratedTypes);
Assert.All(compilerGeneratedTypes, type …Run Code Online (Sandbox Code Playgroud) 我有一个包含枚举的结构:
public enum MyEnum
{
happy = 0,
sad
}
public struct MyStruct
{
public MyEnum feelings;
public int boopCounter;
}
Run Code Online (Sandbox Code Playgroud)
然后我得到一个结构及其内容的文本/字符串版本:
feelings = sad
boopCounter = 12
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个通用解析器,它可以生成具有正确填充字段的结构对象,而不必在每次结构更新时修改解析器。我使用反射总体上是成功的:
// Scan through each member of the structure, looking for a match
foreach (var field in typeof(MyStruct).GetFields(System.Reflection.BindingFlags.Instance |
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.Public))
{
if(field.Name == fieldNameFromText)
{
// This is the member we need to update. Treat enums differently
var fld = typeof(MyStruct).GetField(field.Name);
if(field.FieldType.IsEnum)
{
//fld.SetValue(s, Enum.ToObject(field.FieldType, valFromText)); // Didn't work
fld.SetValue(s, …Run Code Online (Sandbox Code Playgroud) 您好,我对反射很熟悉,我已经通过大量的例子,我知道它是如何工作的,以及我们可以使用它的目的.但我没有得到缓存反射的任何例子,我也不知道它是什么意思.不知何故,我必须在我正在做的项目中使用反射缓存.
因此,如果有人可以简单地解释这个概念并给出一些例子,我将不得不承认,现有例子的链接也将受到赞赏.并且还请描述属性的反映及其缓存.提前致谢.
关心Umair
朋友们,
鉴于这三个类:
public class MyBaseClass {
}
public class MyDerivedClass1: MyBaseClass {
}
public class MyDerivedClass2: MyBaseClass {
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我将有一个类型的对象MyBaseClass(要么是MyDerivedClass2要么MyDerivedClass1)。我如何在运行时确定 ifMyBaseClass是MyDerivedClass1?
所以我是C#的中级程序员,最近我迷上了文件大小并创建了最小的文件。为此,我意识到将MSIL用于更简单的程序可以大量减少大小。
所以我尝试转换以下内容
现在,做完这些之后,我想...为什么当我可以简单地使用反射并不必使用磁盘就可以运行它们时编写文件?
那就是问题所在,我找不到解决方案。
此代码有什么问题?
.assembly a{}
.subsystem 0x0002
.class private AA1.B
extends [mscorlib]System.Object{
.method private static void a(){
.entrypoint
.maxstack 4
.locals init (
[0] string str,
[1] uint8[] buffer)
nop
newobj instance void [System]System.Net.WebClient::.ctor()
ldstr "http://www.mywebwiste.com/myDotNetFile.exe"
call instance uint8[] [System]System.Net.WebClient::DownloadData(string)
stloc.1
ldloc.1
call class [mscorlib]System.Reflection.Assembly [mscorlib]System.Reflection.Assembly::Load(uint8[])
callvirt instance class [mscorlib]System.Reflection.MethodInfo [mscorlib]System.Reflection.Assembly::get_EntryPoint()
ldnull
ldc.i4.0
newarr object
callvirt instance object [mscorlib]System.Reflection.MethodBase::Invoke(object, object[])
}}
Run Code Online (Sandbox Code Playgroud)
我编译的错误是“参考未声明的extern组装系统。” 和“引用未声明的extern程序集mscorlib”。我不是在宣布他们吗?它仍然可以编译它们,但是在运行时会崩溃。
我有一堂课,看起来像
public class Employee
{
public string FirstName { get; set; };
public string LastName { get; set; };
public Address Address { get; set; };
}
public class Address
{
public string HouseNo { get; set; };
public string StreetNo { get; set; };
public SomeClass someclass { get; set; };
}
public class SomeClass
{
public string A{ get; set; };
public string B{ get; set; };
}
Run Code Online (Sandbox Code Playgroud)
我想出了一种使用反射来查找类的原始属性的方法,例如字符串,int bool等
但是我还需要找出像ex这样的类中所有复杂类型的列表。带有Class Employee的Address类和Address内的SomeClass类
我有一个属性类(继承属性),在其中我有一个调用泛型方法的方法:
memberInfo.GetCustomAttribute<T>();
Run Code Online (Sandbox Code Playgroud)
如何将当前类类型传递给T?我不想在内部硬类型,因为它可能被继承,然后它将无法工作.
我正在寻找一种方法来获得对象的两个实例之间的差异.我编写的以下函数使用反射来实现手头的目的,但我想更多地增强它,以便它可以跳过具有特定数据注释的某些字段.例如,在实体框架模型中使用的'[NotMapped]和[JsonIgnore]'注释
public static List<ChangeSet> GetVariances<T>(this T previous, T updated)
{
List<ChangeSet> changeSet = new List<ChangeSet>();
try
{
string[] excludedFields = { "Id", "DateCreated", "DateModified" };
Type entityType = previous.GetType();
FieldInfo[] fieldInfo = entityType.GetFields(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
foreach (FieldInfo x in fieldInfo)
{
if (!excludedFields.Any(z => x.Name.Contains(z))){
ChangeSet change = new ChangeSet
{
Field = x.Name,
PreviousValue = x.GetValue(previous),
UpdatedValue = x.GetValue(updated)
};
if (!Equals(change.PreviousValue, change.UpdatedValue))
changeSet.Add(change);
}
}
}
catch (Exception ex)
{
var exception = ex.Message;
}
return …Run Code Online (Sandbox Code Playgroud) System.Reflection的文档.MemberInfo有以下示例:
foreach (MemberInfo mi in t.GetMembers())
{
if (mi.MemberType == MemberTypes.Method)
{
foreach (ParameterInfo pi in ((MethodInfo)mi).GetParameters())
Run Code Online (Sandbox Code Playgroud)
注意演员(MethodInfo)mi).MemberInfo并且MethodInfo没有共同的父母,为什么允许演员?
c# ×10
reflection ×5
.net ×4
download ×1
generics ×1
il ×1
inheritance ×1
object ×1
parameters ×1
types ×1
variance ×1