标签: reflection

通过反射调用静态委托

我需要使用反射调用委托方法,并将方法名称作为字符串传递。

例如,我将传递类名和委托的My.Controls.TestDelegate.myConverterAction位置:TestDelegatemyConverterAction

namespace My.Controls
{
    public static class TestDelegate
    {
        public static CustomConversionHandler myConverterAction = new CustomConversionHandler(doSomething);

        private static ulong doSomething(object[] values)
        {
            return 2;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

GetMethod()我想以这种方式使用该方法:

int separator = actionDelegate.LastIndexOf('.');
string className = actionDelegate.Substring(0, separator);
string methodName = actionDelegate.Substring(separator + 1, actionDelegate.Length - className.Length - 1);

var t = Type.GetType(className); //This works
MethodInfo m = t.GetMethod(methodName, BindingFlags.Public | BindingFlags.Static); //This returns null...even with different BindingFlags options
Run Code Online (Sandbox Code Playgroud)

但我获得了一个空引用。我怎么解决这个问题?

c# reflection delegates

0
推荐指数
1
解决办法
1834
查看次数

IsSubclassOf() 不适用于父级为泛型的子级,除非指定了泛型类型

给定以下课程:

class A<T> { ... }
class B1: A<int> { ... }
class B2: A<string> { ... }
class C: B1 { ... }
class D: B2 { ... }
Run Code Online (Sandbox Code Playgroud)

我们得到以下结果:

typeof(C).IsSubclassOf(typeof(A<>))        // returns false
typeof(C).IsSubclassOf(typeof(A<int>)   // returns true
Run Code Online (Sandbox Code Playgroud)

现在的问题是,如果我们不知道 B 的泛型类型是什么怎么办?那么我们如何确定我们的类型是否是泛型基类 A<> 的后代呢?

bool IsDescebdedFromA(object x)
{
   return typeof(x).IsSubclassOf(typeof(A<>));    // does not give correct result. we have to specify generic type.
}
Run Code Online (Sandbox Code Playgroud)

已经谢谢了

c# generics reflection

0
推荐指数
1
解决办法
1356
查看次数

Scala 类型:reflect:如何在运行时找到两种类型的最小上限

我正在使用 Scala 类型系统实现一些表达式。为了确定表达式的类型,if-then-else我需要能够实现以下函数

def leastUpperBound(thenPartType: Type, elsePartType: Type): Type
Run Code Online (Sandbox Code Playgroud)

是否有某个函数scala.reflect._可以执行评估?或者我是否必须使用这些提取器来实现搜索*TypeApi

提前致谢

reflection types scala

0
推荐指数
1
解决办法
180
查看次数

在 Java 9 中还可以使用 sun.misc.Unsafe 吗?

在 Java 8 之前,可以sun.misc.Unsafe通过如下方法获取单例实例:

public static Unsafe getUnsafe() {
    try {
        Field f = Unsafe.class.getDeclaredField("theUnsafe");
        f.setAccessible(true);
        return (Unsafe) f.get(null);
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
Run Code Online (Sandbox Code Playgroud)

尽管强烈建议不要使用Unsafe,但许多供应商和图书馆在内部使用它。

现在,有了 Java 9 和 Jigsaw,我认为Unsafe处理方式也发生了变化。我读了一些带有相反信息的帖子。有人说它已完全隐藏,甚至无法检索,有人说必须启用 VM 标志,而另一些人则写道它现在应该得到正式支持。

那么:是否仍然可以sun.misc.Unsafe在 Java 9 中使用?如果可以,如何使用?

java reflection unsafe native java-9

0
推荐指数
1
解决办法
2135
查看次数

获取从抽象类继承的对象列表中所有派生类型的 List&lt;Type&gt;

我见过很多关于从基本类型获取所有类型等的问题,但这并不是我所需要的。例如,我有一个抽象基类:

public abstract class BasePart
{
    //whatever 
}
Run Code Online (Sandbox Code Playgroud)

我有很多从它派生的类。喜欢...

public class HorizontalPanel : BasePart { //code }
public class VerticalPanel : BasePart { //code }
public class RainBoard : BasePart { //code }
Run Code Online (Sandbox Code Playgroud)

等等。我总是按基类列出它们:

List<BasePart> parts;
Run Code Online (Sandbox Code Playgroud)

我使用类型转换和泛型来做我想做的事情。然而,我需要过滤这个列表,并且我只想要其中可用的类型信息。并且只有一次用于类型。例如,如果我的列表有三个 Horizo​​ntalPanels 和两个 VerticalPanels,我想要从中得到的是List<Type>仅包含{HorizontalPanel, VerticalPanel}. 我想我可以在链式循环中摆弄对象本身以获得我想要的东西,但我确信 C# 有更好的方法来做到这一点。任何人?

c# reflection inheritance

0
推荐指数
1
解决办法
1107
查看次数

获取变量名而不是值

使用 bash,我认为这是可能的,但不确定 JavaScript,假设我们有这个:

    const {masterid} = req.query;

    if (!masterid) {
        return res.status(500).send(new Error('Missing query param "masterid".'));
    }
Run Code Online (Sandbox Code Playgroud)

我想要做的不是在字符串中硬编码“masterid”,而是执行如下操作:

    const {masterid} = req.query;

    if (!masterid) {
        return res.status(500).send(new Error(`Missing query param "${Reflect(masterid).name()}.".`));
    }
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 Reflect API 来做到这一点?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect

javascript reflection node.js

0
推荐指数
1
解决办法
3610
查看次数

Activator.CreateInstance 返回 null

我有这么一小段代码:

public static I CreateInstance<I>(string myClassName) where I : class
{
    Debug.Log("Instance: " + (Activator.CreateInstance(null, myClassName) as I));
    return Activator.CreateInstance(null, myClassName) as I;
}

void Test(string testName)
{
    testName = "TestProvider";
    var data = CreateInstance<IProviderInitializer>(testName).GetProviderInfo();
    Debug.Log("Data: " + data);
}
Run Code Online (Sandbox Code Playgroud)

问题是我得到了 NULL Reference Exception,但我不知道为什么。

c# reflection unity-game-engine

0
推荐指数
1
解决办法
5863
查看次数

如何重写私有方法

我正在扩展现有的 Java 类,它有一些私有方法。为了实现我想要的,我必须重写这个私有方法。

所以我读了一些关于 Java 反射的文章,并得出以下结论:

class CustomSlider : Slider() {
    init {
        Slider::class.java.getDeclaredMethod("drawTrack", Canvas::class.java, Int::class.java, Int::class.java).isAccessible = true
    }

    override fun drawTrack(canvas: Canvas, width: Int, top: Int) {
    }
}
Run Code Online (Sandbox Code Playgroud)

但在线上override,我收到一条错误消息,表明这是不可能的。

那么我该怎么做呢?

reflection kotlin

0
推荐指数
1
解决办法
3543
查看次数

Typescript:如何仅从类类型获取所有属性装饰器?

const metadataKey = "metadataKey";
class User
{
    @Reflect.metadata(metadataKey, 1)
    name: string;
    @Reflect.metadata(metadataKey, 2)
    age: number;
}

getPropertyDecorators(User); // I hope it can return [1, 2]
Run Code Online (Sandbox Code Playgroud)

我希望函数 getPropertyDecorators 不需要创建 User 的实例。

reflection typescript typescript-decorator

0
推荐指数
1
解决办法
3412
查看次数

java中如何区分接口和类

我有一些遗留代码,如下所示:

    Set<Class<? extends Foo>> classes = reflections.getSubTypesOf(Foo.class);
    for (Class<? extends Foo> cl : classes) {
        Foo<?, ?> foo = cl.newInstance();
        // use foo
    }
Run Code Online (Sandbox Code Playgroud)

我想添加另一个接口:

interface NewFoo extends Foo {...}
Run Code Online (Sandbox Code Playgroud)

但随后它尝试调用 NewFoo 上的 newInstance。目前我的解决方案是这样的:

        try {
            Foo<?, ?> foo = cl.newInstance();
            // use foo
        } catch (InstantiationException ignore) {
        }
Run Code Online (Sandbox Code Playgroud)

但我想知道是否有更好的方法?当我手里有一个Class对象时,我能区分接口和类吗?

java reflection interface class

0
推荐指数
1
解决办法
100
查看次数