簡體   English   中英

如何通過只有一個類型而不使用反射來訪問一個類型實現的 static 抽象接口成員?

[英]How to access a type's implemented static abstract interface members by having only a type without using reflection?

如何通過只有一個類型並使用接口類型本身來訪問一個類型實現的 static抽象接口成員? 有什么辦法嗎? 不是在談論通過反射訪問 static 成員。

例子:

public interface ISomeInterface
{
   static int SomeProperty {get; set;}
}

public class SomeClass : ISomeInterface
{
   static abstract int SomeProperty {get; set;} = 2;
}

var implementingType = typeof(SomeClass);

ISomeInterface interface = /* How? */ 

有沒有什么方法可以在使用常用方法的情況下通過使用反射來訪問這樣的 static 成員來獲取值

void Method {
   var value = typeof(SomeClass).GetProperty("SomeProperty").GetValue(null);
   value = typeof(ISomeInterface).GetProperty("SomeProperty").GetValue(null);
}

強制轉換是一個僅適用於實例的概念,因此它不能用於類型定義。

在再次考慮了這個問題和我想做什么之后,答案是否定的。

除了反射和通過使用訪問 static 屬性之外,沒有其他方法可以使用接口類型來訪問實現 class 中的 static 抽象接口成員的覆蓋值

GetProperty(name).GetValue(null)

編輯:所以不是建議的地方,但我想到了類似的東西:

ISomeInterface a = (ISomeInterface)typeof(SomeImplementingClass);
var value = a.SomeInterface.SomeProperty;

或者

var value = typeof(SomeImplementingClass).As<ISomeInterface>().SomeProperty;
var value = ISomeInterface.FromType<SomeImplementingClass>().SomeProperty;

...如果未實現接口,則 '.As()' 將引發異常。 不支持這兩個示例。

首先,抽象關鍵字應該應用於接口方法,而不是 class。 如果接口方法不是抽象的,那么您的問題無論如何都是毫無意義的。

Static 抽象接口方法在這里是無關緊要的,因為你不能在沒有指定類型名稱的情況下調用任何 static 方法,換句話說你不能在實例上調用 static 方法。

Fallowing 是我對您的問題的解決方法,它幾乎與直接調用一樣快(盡管它不能被內聯。)使用 static 只讀管理 function 指針來保存構造的方法地址,我們可以避免委托 ZA8CFDE 方法6331BD59EB26AC96 創建和將被視為常量 ZA8CFDE 方法 6331BD59EB2696B jit 的價值,但不需要在這里使事情復雜化..

class Program
{

    public interface ISomeInterface
    {
        abstract static int SomeProperty { get; set; }
    }

    public class SomeClass : ISomeInterface
    {
        static int ISomeInterface.SomeProperty { get; set; } = 2;
    }

    public class SomeClass2 : ISomeInterface
    {
        static int ISomeInterface.SomeProperty { get; set; } = 3;
    }

    public static int GetProp<T>() where T : ISomeInterface
    {
        return T.SomeProperty;
    }

    public static void Main(string[] args)
    {
        var obj = System.Runtime.Serialization.FormatterServices.GetUninitializedObject(typeof(SomeClass)) as ISomeInterface;
        //obj.SomeProperty <= no hopes here..

        var methodDefinitation = typeof(Program).GetMethod(nameof(GetProp), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);

        var @delegate = methodDefinitation.MakeGenericMethod(typeof(SomeClass)).CreateDelegate(typeof(Func<int>)) as Func<int>;
        var @delegate2 = methodDefinitation.MakeGenericMethod(typeof(SomeClass2)).CreateDelegate(typeof(Func<int>)) as Func<int>;
        var result1 = @delegate(); //2
        var result2 = @delegate2(); //3
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM