Unsafe.AsPointer (ref T值)如何工作?(How Unsafe.AsPointer(ref T value) works?)
在C#中,您不能创建指向托管类型的指针,但使用此API,您可以使用
Unsafe.AsPointer<T>
。https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/
我看到使用ILSpy的源代码,我看到了这个:
[MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void* AsPointer<T>(ref T value) { return &value; }
另外在其他类似的API中:
//Unity.Collections.LowLevel.Unsafe.UnsafeUtility public unsafe static T ReadArrayElement<T>(void* source, int index) { return *(T*)((byte*)source + index * sizeof(T)); }
这是如何工作的以及如何复制这种行为?
In C# you're not suppose to be able to create pointer to managed types but with this API you are able to, using
Unsafe.AsPointer<T>
.https://www.nuget.org/packages/System.Runtime.CompilerServices.Unsafe/
I see the source code using ILSpy and I saw this:
[MethodImpl(MethodImplOptions.AggressiveInlining)] [System.Runtime.Versioning.NonVersionable] public unsafe static void* AsPointer<T>(ref T value) { return &value; }
Also in other similar API:
//Unity.Collections.LowLevel.Unsafe.UnsafeUtility public unsafe static T ReadArrayElement<T>(void* source, int index) { return *(T*)((byte*)source + index * sizeof(T)); }
How this works and how is possible to replicate that behaviour?
原文:https://stackoverflow.com/questions/51599375
最满意答案
您正在寻找一种通用方法:
private static void SetEntityPropertiesRequired<TEntity>(DbModelBuilder modelBuilder) { //set all decimal properties in Projection Entity to be Required var decimalproperties = typeof (TEntity).GetProperties() ...
You're looking for a generic method:
private static void SetEntityPropertiesRequired<TEntity>(DbModelBuilder modelBuilder) { //set all decimal properties in Projection Entity to be Required var decimalproperties = typeof (TEntity).GetProperties() ...
相关问答
更多-
TCP/IP模型是一个________。[2023-05-19]
a -
关于DbSet和DbContext(About DbSet and DbContext)[2022-02-22]
直观上,DbContext对应于您的数据库(或数据库中的表和视图集合),而DbSet对应于数据库中的表或视图。 所以你会得到两者的结合是非常有意义的! 您将使用DbContext对象来访问您的表和视图(将由DbSet表示),并且您将使用DbSet来访问,创建,更新,删除和修改表格数据。 如果您的数据库中有10个表,并且您的应用程序可以与其中5个表联合(让我们称它们为表1 - 表5),那么使用定义MyAppContext类的MyAppContext对象来访问它是有意义的: public class MyApp ... -
下列中不属于面向对象的编程语言的是?[2022-05-30]
a -
DbSet
的C#泛型(C# generics for DbSet [2024-01-26]) 由于您在Delete中引用了ID字段,因此需要引入一些界面,例如 interface IHasID { int ID { get; } } 然后,您需要为具有ID的所有实体实现该接口(在部分类中)。 然后你可以像这样更改你的删除 private async TaskDelete (int? id, DbSet dbs) where T : class, IHasID { var row = await dbs.SingleOrDe ... -
强烈将反射.GetValue()对象转换为通用DbSet(Strongly Cast a Reflection .GetValue() Object to a Generic DbSet)[2022-02-15]
我想我已经解决了它,解决方案是使用Method.Invoke。 首先,我已将我的功能转换为扩展方法。 虽然这不是必需的,但它确实允许我写: db.ProvinceStates.ValidateBinding 和 ComboBox1.DataSource = db.Cities.GetBinding 其次,我使用GetMethod,MakeGenericMethod和Invoke编写以下内容: Dim methodLoad = GetType(DbExtensions).GetMethod("Load", ... -
将在运行时通过反射创建的DbSet
传递给Queryable(Passing A DbSet [2022-08-04]created at runtime via reflection to Queryable) 问题是你的动态调用包含两个参数,第一个是静态的,第二个是动态的。 在这种情况下,编译器使用第一个参数的静态类型信息,这是不同的 - 传递dbSet变量时的object和传递dbSet时的DbSet。 诀窍是从这样的编译器隐藏静态类型信息 dynamic q = ((IEnumerable -
您正在寻找一种通用方法: private static void SetEntityPropertiesRequired
(DbModelBuilder modelBuilder) { //set all decimal properties in Projection Entity to be Required var decimalproperties = typeof (TEntity).GetProperties() ... You're looking f ... -
您必须将其更改为IQueryable因为如果将其作为IEnumerable传递,则实际执行查询SELECT * FROM Product 。 您的方法开始迭代结果集,但您的投影调用x.ParentProducts.Select(p => p.Id) ,这会导致延迟加载ParentProducts导航属性。 延迟加载会打开第二个活动数据阅读器,只有在连接字符串中启用它时才可以使用它。 You must change it to IQueryable because if you pass it as IEnu ...
-
根据选择返回DbSet(Return DbSet based on selection)[2022-06-20]
这真的很酷,但有点有用。 public IActionResult DeletePart (string partType, int id) { Type type = GetTypeOfPart(partType); var part = _context.Find(type, id); var entry = _context.Entry(part); entry.State = EntityState.Deleted; _context.SaveChanges ... -
将参数传递给函数(Passing a parameter to a function)[2022-01-31]
Powershell不会在单引号字符串中扩展变量,因此您必须使用双引号字符串: Function FindHistory {history | Where-Object {$_.CommandLine -match "$args"}} 虽然$args是所有参数的数组,但如果只指定一个参数,它可能会更健壮: Function FindHistory {PARAM($searchTerm) history | Where-Object {$_.CommandLine -match "$searchTerm" ...