我终于明白了该方法的用法TypedReference.MakeTypedReference,但为什么参数如此有限?底层的 private可以做比限制字段数组有元素和字段类型为非原始的InternalMakeTypedReference(void* result, object target, IntPtr[] flds, RuntimeType lastFieldType)更多的事情。MakeTypedReference
我制作了一个示例使用代码,展示了它的全部可能性:
private static readonly MethodInfo InternalMakeTypedReferenceMethod = typeof(TypedReference).GetMethod("InternalMakeTypedReference", flags);
private static readonly Type InternalMakeTypedReferenceDelegateType = ReflectionTools.NewCustomDelegateType(InternalMakeTypedReferenceMethod.ReturnType, InternalMakeTypedReferenceMethod.GetParameters().Select(p => p.ParameterType).ToArray());
private static readonly Delegate InternalMakeTypedReference = Delegate.CreateDelegate(InternalMakeTypedReferenceDelegateType, InternalMakeTypedReferenceMethod);
public static void MakeTypedReference([Out]TypedReference* result, object target, params FieldInfo[] fields)
{
IntPtr ptr = (IntPtr)result;
IntPtr[] flds = new IntPtr[fields.Length];
Type lastType = target.GetType();
for(int i = 0; i < fields.Length; i++)
{
var field = fields[i];
if(field.IsStatic)
{ …Run Code Online (Sandbox Code Playgroud) 为什么在C#中使用泛型类型的指针无效?int?*无效,typeof(int?).MakePointerType()但不产生异常.
根据MSDN,指针可以是:
sbyte,byte,short,ushort,int,uint,long,ulong,char,float,double,decimal或bool.
任何枚举类型.
任何指针类型.
任何用户定义的结构类型,仅包含非托管类型的字段.
我没有看到任何与泛型有关的限制.int?看起来有效,因为它只包含一个bool和int字段.
假设我有一个需要优化但同时易于调试的代码.因此,我会为我使用的每个值分配一个字符串.该字符串是否会造成重大性能损失,或者它是否变成了一个从string.Intern在JIT/ AOTcompilation中获得的常量引用,从而变成一条简单的指令?
例:
在IL中它会是ldstr "gazilion lines".
它是在JIT/AOT编译期间变成类似的东西ldsflda string.InternCache.ID_0000647516166
并被const string ID_0000647516166 = "gazilion lines";
添加到string.InternCache?
是的,我理论上可以查看https://github.com/mono/mono但我不知道如何找到它.
是的,我正在混合使用CIL,C#以及编译的CIL,但是你明白了.
为ldstr保证是O(1)?
是的,它是CLR的"实现细节",但如果以这种方式进行优化,那将是有意义的.
我有一个模板类,它声明一个具有模板参数的友函数。代码如下:
template <class T>
class C;
template <class T, class U>
void func(C<T>& t);
template <class T>
class C
{
template <class U>
friend void func<T, U>(C<T>& t);
private:
template <class U>
void f()
{
}
};
template <class T, class U>
void func(C<T>& t)
{
t.f<U>();
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试调用时func,在此friend行出现编译错误:
'func':找不到匹配的重载函数
我该如何交func<T, U>朋友C<T>?
是否可以创建一个对象,该对象可以注册当前线程是否离开创建它的方法,或者检查实例上的方法被调用时是否发生了这种情况?
ScopeValid obj;
void Method1()
{
obj = new ScopeValid();
obj.Something();
}
void Method2()
{
Method1();
obj.Something(); //Exception
}
Run Code Online (Sandbox Code Playgroud)
这项技术能否实现?我想开发一种类似于TypedReference和的机制ArgIterator,它不能"逃避"当前的方法.这些类型是由编译器专门处理的,所以我无法完全模仿这种行为,但我希望至少可以创建具有相同结果的类似规则 - 如果它已经转义了它的方法,则禁止访问该对象创建.
请注意,我无法使用StackFrame和比较方法,因为对象可能会转义并返回相同的方法.
对于有i4o或PLINQ经验的人,我有一个问题.我有一个需要查询的大对象集合(大约400K).逻辑非常简单明了.例如,有Person对象的集合,我需要找到具有相同的名字,姓氏,datebirth,或名字/姓氏的首字母等相匹配的人它只是使用LINQ to对象耗时的过程.
我想知道i4o (http://www.codeplex.com/i4o)
或PLINQ可以帮助提高查询性能.哪一个更好?如果那里有任何方法.
谢谢!
例如,out在C#中使用关键字的方法中的参数将显示在元数据签名中,前面带有&符号&.我正在尝试为通用方法创建签名,但我不想使用元数据API来解决这个问题,当然它已在某处记录了吗?
这是我在Socket类上对BeginReceiveFrom的意思的一个例子:
System.IAsyncResult([]System.Byte,System.Int32,System.Int32,
System.Net.Sockets.SocketFlags,&System.Net.EndPoint,
System.AsyncCallback,System.Object)
Run Code Online (Sandbox Code Playgroud) 如何使用反射调用可变参数方法?像这个:
public static void ArgsMethod(__arglist)
{
ArgIterator ai = new ArgIterator(__arglist);
while(ai.GetRemainingCount() > 0)
{
Console.WriteLine(TypedReference.ToObject(ai.GetNextArg()));
}
}
Run Code Online (Sandbox Code Playgroud)
typeof(Program).GetMethod("ArgsMethod").Invoke(null,new object[0])抛出NotSupportedException。
我在一个可以为空的整数的类中创建了一个属性:
private int? submittedAge {get; set;}
Run Code Online (Sandbox Code Playgroud)
我这样做是因为用户可能会或可能不会进入年龄.稍后在应用程序中我在使用此属性之前进行检查,如果它是非null,我将它传递给需要整数的方法.
if (this.submittedAge != null)
{
result = utilityClass.GetPeopleWithMatchingAge(this.submittedAge);
}
Run Code Online (Sandbox Code Playgroud)
Intellisense给出了一个错误,说方法调用有一些无效的参数.
如果我将submittedAge属性更改回非Nullable整数,那么一切都很好.
也许我不理解可空类型的正确使用.
是否有任何要求您使用C++/CLI的任务,并且无法在托管代码中完成(使用P/Invoke和Marshal类),性能除外?
我想知道是否有一些方法可以将方法组,匿名方法或lambda表达式转换为System.Delegate而不知道确切的委托类型,如
var d = ()=>{};
dynamic d = ()=>{};
Delegate d = ()=>{};
Run Code Online (Sandbox Code Playgroud)
我需要一种方法,适用于任何带有任何参数和返回类型的方法,而不使用反射.谢谢你的回答.
是否可以System.Type从IntPtr类型句柄中获取对象(可以通过获取)?Type.TypeHandle.Value
例:
TypeFromIntPtr(typeof(object).TypeHandle.Value) == typeof(object) //true
Run Code Online (Sandbox Code Playgroud)
编辑:我很高兴有许多有用的人认为我正在尝试解决其他问题,但我正在寻找这个特定问题的答案,我对此非常肯定.我很抱歉没有首先说明它.
编辑#2:类型句柄是一个指针,指向CLR中表示RTTI的结构.我不想从这个结构中读取数据,我想要一种为此返回托管Type对象的方法.我需要将指针"转换"为对象.
关于 Lua 解释器
>print("This is a string
>>spread over multiline")
stdin:1: unfinished string near '"This is a'
Run Code Online (Sandbox Code Playgroud)
因为我们知道在 Lua 解释器上我们可以通过多行完成一个语句例如
>a=2
>a=a+
>>1
Run Code Online (Sandbox Code Playgroud)
这完美地工作
再次:
>print([[This is a multiline
>>string]])
This is a multiline
string
Run Code Online (Sandbox Code Playgroud)
这工作正常!!那么为什么在第一个 print() 语句中显示错误呢??