Как передать объект неизвестного типа в функцию - PullRequest
1 голос
/ 27 февраля 2020

Можно ли написать функцию, которая будет принимать любой тип из object в качестве параметра?

что-то вроде

private bool isItAString(var Input)
{
    string example = "example";
    return Input.GetType() == example.GetType();
}

Ключевое слово var недопустимо в этом случае и ожидает, что это будет определенный c тип объекта.

Ответы [ 4 ]

6 голосов
/ 27 февраля 2020

Сначала давайте сформулируем проблему:

данный Input объект произвольного типа, мы должны вернуть, если это string

Поскольку все объекты в . Net являются потомками object, мы можем объявить Input для типа Object и поставить либо

  // means you can put string value = Input;
  // and value will be assigned  
  private static bool isItAString(object Input) => 
    Input is string;

или если мы хотим выполнить точную проверку (мы хотим, чтобы Input был типа string и ничего более)

  // Or ... => Input == null || ...
  // if we accept null as a valid string 
  private static bool isItAString(object Input) => 
    Input != null && Input.GetType() == typeof(string);

, пожалуйста, обратите внимание, что ключевое слово var означает вывод типа : мы просим. net до выводить требуемый тип вместо того, чтобы вводить его явно:

  // data is of type string[] 
  var data = new List<int>() {1, 2, 3} // List<int>
    .Select(x => x.ToString())         // IEnumerable<string>
    .OrderBy(x => x)                   // IOrderedEnumerable<string>
    .ToArray();                        // string[]  

в вашем случае

   private bool isItAString(var Input)

. Net не может вывести фактический Input тип (это object? string?)

1 голос
/ 27 февраля 2020

Вы должны использовать тип System.Object (или его псевдоним object, что предпочтительно), это базовый тип любого типа C # /. NET

private bool isItAString(object Input)
{
    string example = "example";
    return Input.GetType() == example.GetType();
}

var ключевое слово нельзя использовать с аргументами метода, оно используется в области действия метода для объявления неявно типизированной переменной, в противном случае компилятор не может определить тип переданного аргумента.

Кому Убедитесь, что конкретное значение имеет указанный тип c или нет, вы можете использовать оператор is и упростить свой код до

private bool isItAString(object Input)
{
    return Input is string;
}
1 голос
/ 27 февраля 2020
private bool isItAString(object input)
{
       //Your code here
}

Object(alias object) - базовый класс для всех объектов, поэтому передача его как объекта будет работать.

0 голосов
/ 27 февраля 2020

Если вы определяете функцию с подписью bool isItAString(object input), это все равно, что вы сообщаете компилятору, что переменная input может быть экземпляром любого возможного типа .

Подробное объяснение:

. NET экземпляры объекта всегда имеют тип

Во-первых, ни один экземпляр объекта не имеет действительно unknown типа. Любой экземпляр объекта имеет базовый класс System.Object, поскольку все экземпляры объекта в. NET являются производными от типа System.Object.

Если вам нужно знать реальный тип экземпляра объекта, вы можете проверить его с помощью метода .GetType(), как и в вопросе.

В чем разница между object и var?

object - это псевдоним для System.Object, что такое. NET type

Вы можете использовать его в качестве базового типа для ваших классов :

public class MyClass : System.Object {}

Но этот код не имеет смысла, потому что все ваши типы уже получены из System.Object, как я упоминал выше.

var является синтаксическим сахаром

Он указывает компилятору создать переменную типа, определенного после оператора присваивания (=). Например:

var str = "Hi, i am string" // Compiler understands that str must be a string.
var i = 25 // Compiler understands, that must be an integer
var f = 25f // f marked as a float. So f will be float.
var result = AnyMethod() // result will be that type which AnyMethod returns

Поэтому, когда у вас есть оператор присваивания (=), вы можете использовать var, потому что компилятор может понять, что будет в переменной. Но вы не можете использовать его как параметр метода, потому что компилятор не может понять, что вы пытаетесь разместить здесь. Использование object в качестве параметра метода говорит компилятору, что он может быть любого типа. Таким образом, вы будете точнее указывать компилятору, что использовать.

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