簡體   English   中英

動態將對象類型傳遞給泛型方法

[英]Dynamically pass object type to generic method

我一直在研究泛型,並且試圖弄清楚如何(如果可能)通過動態傳遞對象來跨多個類使用單個方法。

我有以下兩節課,分別是Foo和Bar:

[Serializable()]
public class Foo
{
    private string m_Code;
    private Bar m_Bar = new Bar();

    public string Code
    {
        get { return m_Code; }
        set { m_Code = value; }
    }

    public Bar Bar
    {
        get { return m_Bar; }
        set { m_Bar = value; }
    }
}

[Serializable()]
public class Bar
{
    private string m_Name;

    public string Name
    {
        get { return m_Name; }
        set { m_Name = value; }
    }
}

如果我用一些偽數據填充類,例如:

Foo.Code = "myFoo";
Foo.Bar.Name = "myBar";

我有一個通用的方法從類中返回一個值:

public static object getItem<T>(T obj, string _Value)
{
try
{
    object _Resolved = null;
    _Resolved = obj.GetType().GetProperty(_Value).GetValue(obj, null);
    return _Resolved;
}
catch (Exception ex)
{
    return null;
}
}

像下面那樣調用我的getItem方法工作正常。

string FooCode = Convert.ToString(getItem<Foo>(myFoo, "Code")) // returns "myFoo"
string BarName = Convert.ToString(getItem<Bar>(myFoo.Bar, "Name")) // returns "myBar"

我很好奇的是,是否存在通過定義對象來解決我的getItem方法的通用方法?

例如:

object myObject = Foo;
string FooCode = Convert.ToString(getItem<typeof(myObject)>(myObject, "Code")) // And this would returns "myFoo"

要么:

object myObject = Bar;
string BarName = Convert.ToString(getItem<typeof(myObject)>(myObject, "Name")) // And this would returns "myBar"

你可以這樣

string FooCode = Convert.ToString(getItem(myFoo, "Code")) // returns "myFoo"
string BarName = Convert.ToString(getItem(myFoo.Bar, "Name")) // returns "myBar"

它會自動推斷對象的類型。 如果要在運行時從對象類型調用通用方法,則必須使用反射創建通用方法。 以下是示例。

public class Program 
{
static void Main(string[] args)
        {
            Foo myFoo = new Foo();
            myFoo.Bar = new Bar();
            myFoo.Bar.Name = "Jinal";
            myFoo.Code = "Ths is test";
            // By Using infer
            string FooCode = Convert.ToString(getItem(myFoo, "Code")); // returns "myFoo"
            string BarName = Convert.ToString(getItem(myFoo.Bar, "Name"));

            // Using Reflection
            Type ex = typeof(Program);
            MethodInfo mi = ex.GetMethod("getItem");
            object foo = myFoo;
            var methodgetItem =  mi.MakeGenericMethod(foo.GetType());
            string result = Convert.ToString(methodgetItem.Invoke(null, new object[]{foo , "Code"}));

            object bar = myFoo.Bar;
            var methodgetItem1 = mi.MakeGenericMethod(bar.GetType());
            string result1 = Convert.ToString(methodgetItem1.Invoke(null, new object[] {bar , "Name" }));

            Console.ReadLine();
        }

        public static object getItem<T>(T obj, string _Value)
        {
            try
            {
                object _Resolved = null;
                _Resolved = obj.GetType().GetProperty(_Value).GetValue(obj, null);
                return _Resolved;
            }
            catch (Exception ex)
            {
                return null;
            }
        }
 }

getItem方法中,沒有使用Type參數T 對於您的特定問題(在編譯時不知道obj類型),您可以按照以下方式簡單地定義您的方法-

public static object getItem(object obj, string _Value)

暫無
暫無

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

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