C # вызов типа возврата с другим типом var для аргумента - PullRequest
0 голосов
/ 11 июня 2018

У меня есть структура с некоторыми свойствами.Некоторым из этих свойств присваивается тип переменной, например строка int и т. Д. Но есть одна переменная, которая должна принимать переменные разных типов.Я пробовал следующее:

public class Test{

    Public Generate_Scentence(){
        Answer new = set_values("test", SomeTypeOfVariable);
        //some use case examples:
        Answer new2 = set_values("test2", "test2");
        Answer new2 = set_values("test3", 48584);
        Answer new2 = set_values("test4", 4.4f);
        Answer new2 = set_values("test5", CustomClass a);
        //etc etc
    }


    public struct Answer{
        public string read;
        public System.Object val;
    }

    public Answer set_values(string t, System.Object v){
        Answer a = new Answer();
        a.read = t;
        a.val = v;
        return a;
    }


}

В этом случае SomeTypeOfVariable должен принимать такие типы, как:

string something
int something
CustomClass something
float something 
etc etc

В JavaScript я мог бы просто сделать:

var something = whateveriputhere

Я не могу понять, как это сделать.Я действительно только знаком с JavaScript, это мой первый раз в C #.Извините, если это не правильно или странный вопрос.

Если что-то неясно, дайте мне знать, чтобы я мог уточнить.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Как насчет универсальной структуры / класса и универсальной функции:

public class Test
{

    public void Generate_Scentence()
    {
        var new1 = set_values("test", new SomeTypeOfVariable());
        var new2 = set_values("test2", "test2");
        var new3 = set_values("test3", 48584);
        var new4 = set_values("test4", 4.4f);
        var new5 = set_values("test5", new CustomClass());
        //etc etc
    }


    public Answer<TData> set_values<TData>(string t, TData v)
    {
        var a = new Answer<TData>();
        a.Read = t;
        a.Val = v;
        return a;
    }
}

public struct Answer<TData>
{
    public string Read { get; set; }
    public TData Val { get; set; }
}

public class SomeTypeOfVariable { }
public class CustomClass { }
0 голосов
/ 11 июня 2018

Вы можете определить несколько функций с одинаковыми именами, которые принимают разные типы, называемые перегрузкой функций.

public Answer set_values(string t, string v){...}
public Answer set_values(string t, int v){...}

Однако это не решает проблему хранения данных в объекте ответа.Наиболее распространенным решением этой проблемы является использование generics .

public class Answer<T>
{
    T val {get;set;}
...
}

затем вы можете определить свои set_values ​​для возврата ответа T

public Answer<string> set_values(string t, string v){...}
public Answer<int> set_values(string t, int v){...}

Как кто-то указал в комментариях, вы также можете сделать set_values ​​универсальным, если не делаете ничего конкретногона основе типа.

public Answer<T> set_values<T>(string t, T value){...}

Если вам действительно требуется динамическое хранилище во время выполнения, вы всегда можете вернуться к динамическому.

...